【问题标题】:Can i know if the caller retained a copy of the shared pointer?我可以知道调用者是否保留了共享指针的副本吗?
【发布时间】:2013-10-18 15:54:28
【问题描述】:

假设我有一个这样的函数f

class MyClass {
};

boost::shared_ptr<MyClass> f(/*other input parameters*/) {
  static boost::shared_ptr<MyClass> p;
  if (!p.get() || /*Test if somebody else has a copy of my pointer*/) {
    p.reset(new MyClass() );
  }

  /*Do other stuff*/

  return p;
}

我可以检查调用者是否保留了我的指针的副本吗?如果我释放了我的指针,他也释放了他的指针,内存会被释放吗?

【问题讨论】:

  • 你不应该想知道,这违背了共享指针的全部目的。一旦最后一个所有者释放指针,就会调用析构函数。
  • @Vlad 我有一个用例(MyClass 是一个支持类,它还包含一个可以根据输入参数重新分配的缓冲区,调用者可以发送指向之前已经创建的 MyClass 的指针,并且函数返回指向 MyClass 的指针,以便调用者可以决定是否将其用于下一次调用),但如果我以不同的方式做事可能会更好。 :)
  • 为什么不让MyClass 不可变,并在需要时分配一个新的MyClass

标签: c++ pointers boost shared-ptr


【解决方案1】:

我可以检查调用者是否保留了我的指针的副本吗?

不,正如弗拉德所说,你真的不应该想知道。有这个use_count 函数,但是 boost 警告不要使用它。

注意:use_count() 不一定有效。仅用于调试和测试目的,不能用于生产代码。

关于第二个问题,

如果我释放了我的指针,他也释放了他的指针,内存会被释放吗?

答案是肯定的,只要所有权仅在这两个实例之间共享。

【讨论】:

  • 我刚刚看到 use_count()... 只是为了理解,这行得通吗?你认为它会以何种方式效率低下?它会检查所有正在使用的内存吗?
【解决方案2】:

boost::shared_ptr(和std::tr1::shared_ptr,以及在 C++11 中的std::shared_ptr)的全部意义在于,当保留共享指针副本的最后一位代码不存在时,内存被释放了。

[编辑:完全不正确的分析已删除]

【讨论】:

  • 关于第 5 点:作为静态变量,我怀疑“我的”副本会被破坏。关于第 2 点:第二次调用该函数时,该测试很重要。
  • 对不起;我完全错过了static。请无视我的回答。 [编辑答案以消除错误。 ]
【解决方案3】:

您可以覆盖全局newdelete 运算符并检查指针指向的内存是否仍然被占用。如果是这样并且您已经重置了指向内存的自己的共享指针,那么唯一的结论是,用户没有重置他的。但是,这不一定有效或推荐。由于自定义删除器功能,shared_ptr 包含的指针也不一定指向new 分配的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多