测试,如果对象被删除

时间:2010-05-03 12:37:30

标签: c++ object testing delete-operator

请查看以下代码:

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指针确定对象是否被删除(或未被删除)?

3 个答案:

答案 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)

当你有一个物体时,它会在内存中的某个地方。这是n1n2的值。删除对象时,通过释放该对象使用的内存,内存无效。因此,如果被删除,您永远不能访问任何n1个点。

我建议创建一个包装器对象,它包含一个计数器和一个指向该对象的指针。当你想指向实际的对象时,你必须指向包装器,当你想要删除对象时,你实际上在包装器上调用一个方法:

如果要指向该对象,则应增加包装器的计数器,并指向包装器。如果要删除该对象,则应减少计数器并将指向包装器的指针设置为null。如果包装器的计数器达到零,则可以安全地删除实际对象,然后删除包装器。