假设我有一个定义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
会泄露。