如果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;
这不是保存数据的正确方法。为了让它工作(或看起来工作),你必须做一些hack。例如,对数据进行另一个引用,然后将其泄露:
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...
}
这个hack泄漏了分配的std::shared_ptr
内容,因此它永远不会被删除,因此它的引用计数不会减少并且分配int
的内容会被泄露。