假设我有一个这样的函数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;
}
我可以检查调用者是否保留了指针的副本吗?如果我释放我的指针,并且他也释放了他的指针,会释放内存吗?
答案 0 :(得分:1)
我可以检查调用者是否保留了指针的副本吗?
不,正如弗拉德所说,你真的不应该知道。有这个use_count
函数,但是增强警告不要使用它。
注意:use_count()不一定有效。仅用于调试和测试目的,不用于生产代码。
至于你的第二个问题,
如果我释放我的指针,并且他也释放了他的指针,会释放内存吗?
答案是肯定的,前提是所有权仅在这两个实例之间共享。
答案 1 :(得分:0)
boost::shared_ptr
(和std::tr1::shared_ptr
以及C ++ 11 std::shared_ptr
)的重点是当最后一段代码保持共享指针的副本时在存在之后,记忆被释放了。
[编辑:删除完全不正确的分析]
答案 2 :(得分:0)
您可以覆盖全局new
和delete
运算符,并检查指针指向的内存是否仍然被占用。如果是这样,你已经重置了自己的指向内存的共享指针,那么唯一的结论就是,用户没有重置他的。但这不一定有效或推荐。由于自定义删除功能,shared_ptr
包含的指针也不一定指向new
分配的内存。