我可以知道调用者是否保留了共享指针的副本?

时间:2013-10-18 15:54:28

标签: c++ pointers boost shared-ptr

假设我有一个这样的函数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;
}

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

3 个答案:

答案 0 :(得分:1)

  

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

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

  

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

至于你的第二个问题,

  

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

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

答案 1 :(得分:0)

boost::shared_ptr(和std::tr1::shared_ptr以及C ++ 11 std::shared_ptr)的重点是当最后一段代码保持共享指针的副本时在存在之后,记忆被释放了。

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

答案 2 :(得分:0)

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