扩展/递增智能指针的引用计数



假设我有一个定义shared_ptr的方法。方法完成后,shared_ptr也将被删除。在此期间,我有另一个成员使用该shared_ptr.因此,我想将shared_ptr的使用寿命延长到初始方法之后。

void initial_method(int input)
{
std::shared_ptr<int> a { std::make_shared<int>(input) };
some_delayed_method(a);
}

在此示例中,是否可以手动将 a 的引用计数增加 1?

some_delayed_method()就像一个支队,指的是initial_method()回来后的一次a

由于如果不shared_ptr对象,就无法调用some_delayed_method,并且对对象的任何shared_ptr都会延长其生存期,因此您无需执行任何操作。

如果some_delayed_method将指针保存在某个外部数据结构中,并且稍后将使用此指针,则应为此使用shared_ptr

class X
{
public:
void initial_method(int input)
{
std::shared_ptr<int> a { std::make_shared<int>(input) };
some_delayed_method(a);
}
void some_delayed_method(const std::shared_ptr<int>& a)
{
use_later = a;
}
private:
std::shared_ptr<int> use_later;
}

这样,将自动处理引用计数。


您可以坚持使用原始指针来保存数据以供以后使用:

void some_delayed_method(const std::shared_ptr<int>& a)
{
use_later = a.get();
}
...
int* use_later;

这不是保存数据的正确方法。要使其工作(或看起来有效),您必须做一些黑客。例如,对数据进行另一个引用,并将其泄露:

void some_delayed_method(const std::shared_ptr<int>& a)
{
use_later = a.get();
new std::shared_ptr<int>(a); // horrible hack; please never do it! but it works...
}

此黑客会泄漏分配的std::shared_ptr,因此它永远不会被删除,因此它的引用计数不会减少,并且分配的int会泄露。

最新更新