我有一个对象说。
ClassA *obj1 = new ClassA;
ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;
当我delete ptr1;
时,它会影响ptr2
吗?如果是这样,那么什么是正确的解决方案?
答案 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;
之后,我们有三个指针(obj1
,ptr1
,ptr2
)都指向同一个对象。
如果我们delete ptr1;
(或等效地,delete obj1;
或delete ptr2;
),我们会销毁指向的对象。执行此操作后,指向该对象的任何指针都将变为无效(这将回答您的第一个问题:是的,它会影响ptr2
,因为ptr2
不会指向有效对象之后)。
正确的解决方案取决于您要实现的目标:
ClassA
具有复制构造函数,请执行ClassA *ptr2 = new ClassA(*obj1);
。完成后,您需要单独delete
这个新对象!boost::shared_ptr
(google it)的内容答案 1 :(得分:1)
假设obj2
应该是obj1
,那么在ptr1
上调用delete会使ptr2
无效数据。解决此问题的方法是将ptr1
设置为NULL
,如果要清空它而不丢失ptr2
中指向的对象。
删除仅适用于您想要完全释放内存的时间。如果您仍想保留指向的对象和数据,但想要清除指针,请将其设置为NULL
(或(void *) 0
)。