我有一个对象说。删除两个指针引用的对象指针
ClassA *obj1 = new ClassA;
ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;
当我做delete ptr1;
,是否会影响ptr2
?如果是这样的话,什么才是正确的解决方案?
我有一个对象说。删除两个指针引用的对象指针
ClassA *obj1 = new ClassA;
ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;
当我做delete ptr1;
,是否会影响ptr2
?如果是这样的话,什么才是正确的解决方案?
(假设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;
后,我们有三个指针(obj1
,ptr1
,ptr2
)都指向同一个对象。
如果我们做delete ptr1;
(或等效地delete obj1;
或delete ptr2;
),我们销毁指向的对象。这样做后,任何指向该对象的指针都会失效(这会回答您的第一个问题:是的,它会影响ptr2
,因为ptr2
之后不会指向有效的对象)。
正确的解决方案取决于你想要达到的目的:
ClassA
有一个拷贝构造函数,做ClassA *ptr2 = new ClassA(*obj1);
。当您完成这个任务后,您需要单独使用delete
这个新对象!boost::shared_ptr
(google一下)嗯,这是很多文本的这样一个简单的Q +一个。呃,好吧。
Thnx现在有很多了解这个概念。 – boom 2010-09-23 04:53:11
假设obj2
应该是obj1
那么是的,在ptr1
上的呼叫删除将带有无效数据的ptr2
。解决方法是将ptr1
设置为NULL
,如果您希望将其清空而不丢失指向ptr2
中的对象。
删除只是为了当你想完全释放内存。如果您仍然希望保留指向的对象和数据,但要清除指针,请将其设置为NULL
(或(void *) 0
)。
在C++中,'NULL'只是0(或等效),而不是指针类型。 – GManNickG 2010-09-23 04:44:03
我假设'obj2'应该是'obj1'?无论如何,解决方案是[停止手动管理内存](http:// stackoverflow。COM /问题/ 3681455 /什么,是最哲学 - 的 - 管理 - 存储 - 在-C/3681471#3681471)。 – GManNickG 2010-09-23 04:23:45