-1

假设我有一个定义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 的引用计数增加一?

some_delayed_method()就像一个支队,指的是a在返回之后的时间initial_method()

4

2 回答 2

2

由于您不能在some_delayed_method没有 ashared_ptr的情况下调用对象,并且对象的any shared_ptr会延长其生命周期,因此您无需执行任何操作。

于 2020-10-27T23:08:13.523 回答
0

如果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的内容会被泄露。

于 2020-10-27T23:08:50.663 回答