删除由两个指针引用的对象指针

时间:2010-09-23 04:19:25

标签: c++ memory-management

我有一个对象说。

ClassA *obj1 = new ClassA;

ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;

当我delete ptr1;时,它会影响ptr2吗?如果是这样,那么什么是正确的解决方案?

2 个答案:

答案 0 :(得分:2)

(假设obj2应为obj1

ClassA *x定义了一个指针,它可以指向ClassA类型的对象。指针本身不是对象。

new ClassA分配(并构造)ClassA类型的实际对象。

因此,行Class A *obj1 = new ClassA;定义了一个指针obj1,然后将其设置为指向新分配的ClassA类型的对象。

Class A *ptr1 = obj1;定义指针ptr1,然后将其设置为指向obj1所指向的同一事物,即我们刚刚创建的ClassA对象

在行Class A *ptr2 = obj1;之后,我们有三个指针(obj1ptr1ptr2)都指向同一个对象。

如果我们delete ptr1;(或等效地,delete obj1;delete ptr2;),我们会销毁指向的对象。执行此操作后,指向该对象的任何指针都将变为无效(这将回答您的第一个问题:是的,它会影响ptr2,因为ptr2不会指向有效对象之后)。

正确的解决方案取决于您要实现的目标:

  • 如果您想要对象的两个副本,假设ClassA具有复制构造函数,请执行ClassA *ptr2 = new ClassA(*obj1);。完成后,您需要单独delete这个新对象!
  • 如果您想要指向同一个对象的两个指针,请考虑使用类似boost::shared_ptr(google it)的内容
嗯,这个简单的q + a有很多文字。好吧。

答案 1 :(得分:1)

假设obj2应该是obj1,那么在ptr1上调用delete会使ptr2无效数据。解决此问题的方法是将ptr1设置为NULL,如果要清空它而不丢失ptr2中指向的对象。

删除仅适用于您想要完全释放内存的时间。如果您仍想保留指向的对象和数据,但想要清除指针,请将其设置为NULL(或(void *) 0)。