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

Gal*_*age 3 c++ object dynamic-memory-allocation

让我们说吧

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

  ~A (){
    delete array;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

A* object_ptr =new A();
Run Code Online (Sandbox Code Playgroud)

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

Bau*_*gen 7

调用

delete object_ptr;
Run Code Online (Sandbox Code Playgroud)

A* object_ptr =new A();
Run Code Online (Sandbox Code Playgroud)

将调用A指向的析构函数object_ptr.这意味着,如果你搞错了

~A (){
  delete array;
}
Run Code Online (Sandbox Code Playgroud)

~A (){
  delete[] array;
}
Run Code Online (Sandbox Code Playgroud)

你的代码没问题,内部指针正确释放.

但是,你真的应该使用std::vector而不是new[].它会让你的生活变得更轻松.如果你坚持new[],请阅读"三个规则".


Ben*_*ler 5

有两点需要注意。

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

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