【问题标题】:Extending/Incrementing the ref count of a smart pointer扩展/增加智能指针的引用计数
【发布时间】:2020-10-27 22:36:35
【问题描述】:

假设我有一个定义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() 就像一个支队,在initial_method() 返回后一次引用a

【问题讨论】:

  • 您不必这样做。 std::shared_ptr 在方法调用期间有效。
  • 简单地复制 shared_ptr 应该足以延长它所指向的int 的生命周期,这是你的想法吗?
  • edit您的问题并澄清问题所在:我看到至少有两个人(包括我自己)误解了它。也许显示更多您的代码。也许添加一些显示问题所在的打印语句。
  • @OS2 你编辑了你的问题,这完全改变了它的范围!在任何情况下,您都应该显示 some_delay_method 的代码。
  • 这能回答你的问题吗? How to release pointer from boost::shared_ptr?

标签: c++ shared-ptr ownership-semantics


【解决方案1】:

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

【讨论】:

  • @OS2 我再次阅读并坚持这个答案。无论代码调用some_delayed_method,无论何时何地调用它,都必须将std::shared_ptr 保持到a,这样它就已经存在了。
【解决方案2】:

如果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 被泄露。

【讨论】:

  • “hack”确实泄露了newly 分配的std::shared_ptr,所以它永远不可能是deleted,因此分配的int 的引用计数没有减少并且被泄露,也是。
  • 感谢您对其工作原理的描述!我忘了提到int 对象本身已泄露。
  • 好的,谢谢。我正在寻找一种不必制作第二份副本的方法。按照这个速度,我还不如只使用原始指针(新删除)。
  • use_later = a; 已在调用some_delayed_method() 之前执行。我不妨使用原始指针。
  • 你为什么建议故意泄漏内存...用所有东西的智能指针?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2017-03-20
  • 1970-01-01
  • 2011-07-08
  • 2010-10-18
  • 2016-09-14
相关资源
最近更新 更多