shared_ptr完全在堆栈上

时间:2017-05-18 16:02:54

标签: c++ c++11 shared-ptr smart-pointers

假设我知道堆栈帧将比shared_ptr的所有副本更长,有没有办法为堆栈对象创建shared_ptr,使得引用计数器在堆栈上,以便在任何时候都没有动态分配?

e.g。

SomeObject anObject;
std::shared_ptr::ref_counter refCounter; // Does this exist?

std::shared_ptr<SomeObject>(&anObject, &refCounter, [](SomeObject* obj){
    obj->DoSomething();
});

这里的目标是使用shared_ptr作为其引用计数而不是智能指针。

编辑:我将添加更多解释,以便更清楚地说明这一点。

我正在尝试创建一个令牌来调用函数,当它和它的所有副本被销毁时,我正在写一个线程库。每个标记本质上只是一个指向持久化对象的智能指针的包装器,该持久化对象保存该函数并在其析构函数中调用它。复制令牌会复制包装器(以及智能指针),但不会复制持久对象。

鉴于这些令牌可能传递给许多不同的线程,持久对象通常需要在堆上,但有时我可以保证特定的堆栈帧将比它创建的任何令牌的所有副本都活得更长。在这些情况下,可以在堆栈上创建令牌的持久部分,从而放弃任何昂贵的堆分配。

因此,在某些情况下,智能指针 需要实际拥有它所指向的对象,但在其他情况下它并不是。

2 个答案:

答案 0 :(得分:3)

无法使用共享指针管理堆栈分配的对象。

然而,也不应该有任何需要。代替共享指针,您可以使用裸指针或引用。由于您知道引用的对象将比所有用户更长,因此它是安全的。

  

我试图创建一个令牌,当它及其所有副本被销毁时调用该函数

为此,您不想使用共享指针。您应该只实现自己的参考计数器。

答案 1 :(得分:0)

你可以这样做,但这不是一个好的选择*。

SomeObject anObject;
std::shared_ptr<SomeObject>(&anObject, [](auto x){}});

coliru example

*这不会使用shared_ptr的大多数功能而且是浪费,并且可以通过许多其他方式记录计数,包括实现您自己的计数类。

我真的认为没有理由阻止动态分配。即使你不能使用堆,动态分配也可以在堆栈上完全发生。

相关问题