1

假设我有这样的功能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;
}

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

4

3 回答 3

1

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

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

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

至于你的第二个问题,

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

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

于 2013-10-18T15:56:20.377 回答
0

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

于 2013-10-19T19:36:08.483 回答
0

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

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

于 2013-10-19T00:44:09.027 回答