删除调用析构函数吗?
我有一个类(A)为其中一个字段使用堆内存分配。 类A被实例化并作为指针字段存储在另一个类(B)中。
当我完成对象B时,我打电话给删除,我认为这是调用析构函数......但是这是否也调用类A中的析构函数?
编辑:
从答案中可以看出(如果不正确,请修改):
delete
B实例B调用B ::〜B(); A::~A();
and A::~A
应该明确地delete
and A::~A
所有堆分配成员变量; 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
在上面的例子中,每个删除和删除[]都是必需的。 并且不需要删除(或确实可以使用),我不使用它。
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
当你调用由new分配的指针的delete时,指向的对象的析构函数将被调用。
A * p = new A;
delete p; // A:~A() called for you on obkect pointed to by p
它被命名为“析构函数”,而不是“解构函数”。
在每个类的析构函数内部,你必须删除已经用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;
}
分配B的实例然后删除是干净的,因为B在内部分配的内容也将在析构函数中被删除。
但是类C的实例会泄漏内存,因为它分配了一个它不会释放的实例(在这种情况下,C甚至没有析构函数)。
链接地址: http://www.djcxy.com/p/14531.html上一篇: Does delete call the destructor?
下一篇: Does using "new" on a struct allocate it on the heap or stack?