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

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

本文关键字:指针 对象 另一个 包含 删除      更新时间:2023-10-16

比如

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[],请阅读"三的规则"。

有两点需要注意。

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

另一个需要注意的重点是当你复制你的对象时会发生什么。如果对象被复制,就会出现析构函数从另一个对象下删除指针的问题。这就是为什么shared_ptr是原始指针的一个很好的替代品(参见如何使用shared_ptr的问题)。