请查看以下代码:
class Node
{
private:
double x, y;
public:
Node (double xx, double yy): x(xx), y(yy){}
};
int main()
{
Node *n1 = new Node(1,1);
Node *n2 = n1;
delete n2;
n2 = NULL;
if (n1 != NULL) //Bad test
{
delete n1; //throw an exception
}
}
有两个指针n1,n2指向同一个对象。我想检测是否使用n1指针测试删除了n2。但是这个测试结果是例外。
有没有办法如何使用n1指针确定对象是否被删除(或未被删除)?
答案 0 :(得分:11)
据我所知,处理这种情况的典型方法是使用引用计数指针,例如COM的方式。在Boost中,有一个shared_ptr模板类可以提供帮助(http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm)。
答案 1 :(得分:4)
没有。代码中的任何内容都无法到达n1
指针并在指向对象被销毁时更改它。
为了实现这一点,Node
必须(例如)维护一个指向它的所有指针的列表,并且每次复制指针值时都必须手动注册(即调用方法) 。与之合作会非常痛苦。
答案 2 :(得分:0)
当你有一个物体时,它会在内存中的某个地方。这是n1
和n2
的值。删除对象时,通过释放该对象使用的内存,内存无效。因此,如果被删除,您永远不能访问任何n1
个点。
我建议创建一个包装器对象,它包含一个计数器和一个指向该对象的指针。当你想指向实际的对象时,你必须指向包装器,当你想要删除对象时,你实际上在包装器上调用一个方法:
如果要指向该对象,则应增加包装器的计数器,并指向包装器。如果要删除该对象,则应减少计数器并将指向包装器的指针设置为null。如果包装器的计数器达到零,则可以安全地删除实际对象,然后删除包装器。