【发布时间】:2019-04-11 18:20:58
【问题描述】:
遇到了这个错误,其中一个类包含一个指向自身的指针——并且它指向同一个实例。这是包含该问题的最小代码sn-p...
class Node
{
public:
Node()
{
std::cout << "constructor" << std::endl;
}
~Node()
{
std::cout << "destructor" << std::endl;
}
void storeChild(boost::shared_ptr<Node> ptr)
{
m_ptr = ptr;
}
private:
boost::shared_ptr<Node> m_ptr;
};
int main()
{
boost::shared_ptr<Node> bc_ptr(new Node());
bc_ptr->storeChild(bc_ptr); // this line is the bug
return 0;
}
我的问题是:
1. Node 对象是否曾经被删除过?我知道智能指针应该管理这些东西,所以我们不必删除。但看起来使用storeChild 传递给类的引用从未被重置。这是否意味着我将有内存泄漏?
2. 有没有办法使用智能指针来防止这种情况发生?显然,storeChild 方法应该被赋予一个指向不同节点的指针,但你如何防止这种情况发生?
如果我运行这个程序,析构函数永远不会被调用。
【问题讨论】:
-
Node 对象永远不会被删除,因为它拥有自己。我将首先在您的 storeChild 方法中添加
assert(this != ptr.get())。这是程序员的错误,你无法真正阻止它的发生。附带说明,如果您希望节点实际拥有其子节点,请考虑使用 unique_ptr。 -
boost::shared_ptr现在有一个名为std::shared_ptr的标准类似物。
标签: c++ pointers shared-ptr