2015-05-25 70 views
0

比方说C++删除指向包含另一个指针对象

class A { 
    A* array; 
public: 
    A(){ 
    array= new A [4]; 
    } 

    ~A(){ 
    delete array; 
    } 
} 

我们如何释放一个对象,如果我们创建堆这样一个对象像

A* object_ptr =new A(); 

我有点困惑于释放指向包含另一个指针的对象的指针.....

回答

0

有两件事要注意。

  1. 删除数组时,应该使用[]。例如:delete [] array;
  2. 删除指针时,分配的对象的析构函数将被调用。你会从你的代码中调用:delete object_ptr;来删除你的指针。

另一个需要注意的重点是复制对象时发生的情况。如果你的对象获得副本,你会遇到问题,一个析构函数从另一个对象下删除指针。这就是为什么shared_ptr是原始指针的不错选择(关于如何使用shared_ptr,请参阅this question)。

+0

如果我将object_ptr赋值给一个新指针,会导致同样的问题吗? – GalaxyVintage

+0

是的。如果你写:'A * a = new A(); A * b = a;删除一个;然后''''''''''内部'阵列'也将被删除。 –

+0

嗯......如果一个对象是由栈中创建的一个方法创建的,那么堆中的内存是否会被释放? – GalaxyVintage

5

调用

delete object_ptr; 

A* object_ptr =new A(); 

将调用A的析构函数object_ptr指向。这意味着,如果您修正错误

~A(){ 
    delete array; 
} 

~A(){ 
    delete[] array; 
} 

你的代码会被罚款和内部指针被正确地释放。

顺便说一句,你真的应该使用std::vector而不是new[]。它会让你的生活变得更加轻松。如果您坚持要求new[],请阅读The Rule of Three

+0

和'std :: unique_ptr'(如果有的话)而不是'纯粹的'指针 – Hcorg

+0

@Hcorg个人而言,我从来没有遇到过一个指针成员是个好主意的问题。但一般来说,*“没有拥有指针”*当然是很好的建议。 –

相关问题