class A {
A* array;
public:
A(){
array= new A [4];
}
~A(){
delete array;
}
}
我们如何释放一个对象,如果我们创建堆这样一个对象像
A* object_ptr =new A();
我有点困惑于释放指向包含另一个指针的对象的指针.....
class A {
A* array;
public:
A(){
array= new A [4];
}
~A(){
delete array;
}
}
我们如何释放一个对象,如果我们创建堆这样一个对象像
A* object_ptr =new A();
我有点困惑于释放指向包含另一个指针的对象的指针.....
有两件事要注意。
[]
。例如:delete [] array;
delete object_ptr;
来删除你的指针。另一个需要注意的重点是复制对象时发生的情况。如果你的对象获得副本,你会遇到问题,一个析构函数从另一个对象下删除指针。这就是为什么shared_ptr
是原始指针的不错选择(关于如何使用shared_ptr
,请参阅this question)。
当你的对象delete
被调用析构函数,这就是你需要担心的。这里更多的信息:Does delete call the destructor?
调用
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。
和'std :: unique_ptr'(如果有的话)而不是'纯粹的'指针 – Hcorg
@Hcorg个人而言,我从来没有遇到过一个指针成员是个好主意的问题。但一般来说,*“没有拥有指针”*当然是很好的建议。 –
如果我将object_ptr赋值给一个新指针,会导致同样的问题吗? – GalaxyVintage
是的。如果你写:'A * a = new A(); A * b = a;删除一个;然后''''''''''内部'阵列'也将被删除。 –
嗯......如果一个对象是由栈中创建的一个方法创建的,那么堆中的内存是否会被释放? – GalaxyVintage