C ++删除指向包含另一个指针的对象的指针

时间:2015-05-25 20:04:53

标签: c++ object dynamic-memory-allocation

让我们说

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

  ~A (){
    delete array;
  }
}

如果我们在堆上创建像

这样的对象,我们如何释放对象
A* object_ptr =new A();

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

2 个答案:

答案 0 :(得分:7)

调用

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

答案 1 :(得分:3)

有两点需要注意。

  1. 删除数组时,应使用[]。例如:delete [] array;
  2. 删除指针时,将调用已分配对象的析构函数。您可以从代码中调用:delete object_ptr;删除指针。
  3. 要注意的另一个重点是复制对象时会发生什么。如果你的对象得到了副本,你就会遇到一个问题,一个析构函数从另一个对象下面删除指针。这就是为什么shared_ptr是原始指针的一个很好的替代方法(有关如何使用shared_ptr,请参阅this question)。