4

请看下面的代码:

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

4

3 回答 3

11

据我所知,处理这种情况的典型方法是使用引用计数指针,(例如)COM 的方式。在 Boost 中,有一个 shared_ptr 模板类可以提供帮助(http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm)。

于 2010-05-03T12:43:39.067 回答
4

不。您的代码中没有任何方法可以到达n1指针并在指向的对象被销毁时更改它。

为此,Node必须(例如)维护指向它的所有指针的列表,并且每次复制指针值时都必须手动注册(即调用方法)。一起工作会很痛苦。

于 2010-05-03T12:39:18.300 回答
0

当您有一个对象时,它将位于内存中的某个位置。这是 和 的n1n2。当你删除对象时,通过释放对象使用的内存,内存是无效的。因此,如果它被删除,您将永远无法访问任何n1指向的内容。

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

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

于 2010-05-03T12:44:24.790 回答