Nic*_*ton 161 c++ destructor memory-management base-class delete-operator
我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.
当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?
从答案中,我接受了(请编辑,如果不正确):
class A B的实例调用B :: ~B();class Bdelete 应该显式地将delete所有堆分配的成员变量A;Ecl*_*pse 180
A的析构函数将在其生命周期结束时运行.如果您希望释放其内存并运行析构函数,则必须在堆上分配它时将其删除.如果它是在堆栈上分配的,则会自动发生(即,当它超出范围时;请参阅RAII).如果它是类的成员(不是指针,而是完整成员),则在包含对象被销毁时会发生这种情况.
class A
{
char *someHeapMemory;
public:
A() : someHeapMemory(new char[1000]) {}
~A() { delete[] someHeapMemory; }
};
class B
{
A* APtr;
public:
B() : APtr(new A()) {}
~B() { delete APtr; }
};
class C
{
A Amember;
public:
C() : Amember() {}
~C() {} // A is freed / destructed automatically.
};
int main()
{
B* BPtr = new B();
delete BPtr; // Calls ~B() which calls ~A()
C *CPtr = new C();
delete CPtr;
B b;
C c;
} // b and c are freed/destructed automatically
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,需要每次删除和删除[].在我没有使用它的情况下,不需要删除(或者确实可以使用).
auto_ptr,unique_ptr和shared_ptr等..非常适合做这个生命周期管理要容易得多:
class A
{
shared_array<char> someHeapMemory;
public:
A() : someHeapMemory(new char[1000]) {}
~A() { } // someHeapMemory is delete[]d automatically
};
class B
{
shared_ptr<A> APtr;
public:
B() : APtr(new A()) {}
~B() { } // APtr is deleted automatically
};
int main()
{
shared_ptr<B> BPtr = new B();
} // BPtr is deleted automatically
Run Code Online (Sandbox Code Playgroud)
小智 30
当您对由new分配的指针调用delete时,将调用指向的对象的析构函数.
A * p = new A;
delete p; // A:~A() called for you on obkect pointed to by p
Run Code Online (Sandbox Code Playgroud)
Seb*_*ach 22
它被命名为"析构函数",而不是"解构函数".
在每个类的析构函数中,您必须删除已使用new分配的所有其他成员变量.
编辑:澄清:
说你有
struct A {}
class B {
A *a;
public:
B () : a (new A) {}
~B() { delete a; }
};
class C {
A *a;
public:
C () : a (new A) {}
};
int main () {
delete new B;
delete new C;
}
Run Code Online (Sandbox Code Playgroud)
分配B的实例然后删除是干净的,因为B内部分配的内容也将在析构函数中删除.
但是C类的实例会泄漏内存,因为它分配了一个它不释放的A实例(在这种情况下C甚至没有析构函数).
如果你有一个通常的指针(A*)那么析构函数将不会被调用(A例如,内存也不会被释放),除非你delete在B析构函数中明确地执行.如果你想要自动销毁,请查看智能指针auto_ptr.
| 归档时间: |
|
| 查看次数: |
274113 次 |
| 最近记录: |