2010-09-23 103 views
0

我有一个对象说。删除两个指针引用的对象指针

ClassA *obj1 = new ClassA; 

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

当我做delete ptr1;,是否会影响ptr2?如果是这样的话,什么才是正确的解决方案?

+1

我假设'obj2'应该是'obj1'?无论如何,解决方案是[停止手动管理内存](http:// stackoverflow。COM /问题/ 3681455 /什么,是最哲学 - 的 - 管理 - 存储 - 在-C/3681471#3681471)。 – GManNickG 2010-09-23 04:23:45

回答

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一下)

嗯,这是很多文本的这样一个简单的Q +一个。呃,好吧。

+0

Thnx现在有很多了解这个概念。 – boom 2010-09-23 04:53:11

1

假设obj2应该是obj1那么是的,在ptr1上的呼叫删除将带有无效数据的ptr2。解决方法是将ptr1设置为NULL,如果您希望将其清空而不丢失指向ptr2中的对象。

删除只是为了当你想完全释放内存。如果您仍然希望保留指向的对象和数据,但要清除指针,请将其设置为NULL(或(void *) 0)。

+3

在C++中,'NULL'只是0(或等效),而不是指针类型。 – GManNickG 2010-09-23 04:44:03