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。
有两点需要注意。
- 删除数组时应使用
[]
。例如:delete [] array;
- 删除指针时,将调用分配对象的析构函数。你会从你的代码中调用:
delete object_ptr;
来删除你的指针。
另一个需要注意的重点是复制对象时会发生什么。如果您的对象曾经获得副本,您将遇到一个析构函数从另一个对象下删除指针的问题。这就是为什么 shared_ptr
是原始指针的一个很好的替代品(参见 this question 如何使用 shared_ptr
)。
假设
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。
有两点需要注意。
- 删除数组时应使用
[]
。例如:delete [] array;
- 删除指针时,将调用分配对象的析构函数。你会从你的代码中调用:
delete object_ptr;
来删除你的指针。
另一个需要注意的重点是复制对象时会发生什么。如果您的对象曾经获得副本,您将遇到一个析构函数从另一个对象下删除指针的问题。这就是为什么 shared_ptr
是原始指针的一个很好的替代品(参见 this question 如何使用 shared_ptr
)。