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

C++ Deleting a pointer to a object that contains another pointer

假设

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

  ~A (){
    delete array;
  }
}

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

A* object_ptr =new A();

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

通话中

delete object_ptr;

之后

A* object_ptr =new A();

将调用 object_ptr 指向的 A 的析构函数。也就是说,如果你改正错误

~A (){
  delete array;
}

~A (){
  delete[] array;
}

您的代码没有问题,内部指针已正确释放。

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

有两点需要注意。

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

另一个需要注意的重点是复制对象时会发生什么。如果您的对象曾经获得副本,您将遇到一个析构函数从另一个对象下删除指针的问题。这就是为什么 shared_ptr 是原始指针的一个很好的替代品(参见 this question 如何使用 shared_ptr)。