调用析构函数释放动态分配的内存
Calling destructor to free dynamically allocated memory
让我们考虑这段代码:
#include <iostream>
class A{
public:
~A() {}
};
int main(){
A *p = new A();
p->~A();
return 0;
}
我想知道 p
指向的对象 A
的内存是否被释放,或者我们必须调用 delete p;
内存未释放。析构函数销毁对象但不释放内存。怎么可能呢?您可以销毁动态分配的对象、堆栈中的对象、全局对象等。析构函数不知道释放内存需要什么(如果有的话)。
调用析构函数或任何其他成员函数之间没有区别,除了一件事 - 你不应该这样做,除非你想将对象分配与其构造和销毁分开。
内存是使用运算符 new and will be freed (deallocated) using operator delete 分配的,而不是对象的析构函数。
大家不要混淆object lifetime with dynamic memory management。
释放分配的内存不是A'
的destructor角色,不应显式调用。它只是一个成员函数,当 您的对象被销毁时,它会被调用 。它会在你调用 delete
后被销毁。
替换:
p->~A();
与:
delete p;
现在您的对象被销毁并且分配的内存被释放。
让我们考虑这段代码:
#include <iostream>
class A{
public:
~A() {}
};
int main(){
A *p = new A();
p->~A();
return 0;
}
我想知道 p
指向的对象 A
的内存是否被释放,或者我们必须调用 delete p;
内存未释放。析构函数销毁对象但不释放内存。怎么可能呢?您可以销毁动态分配的对象、堆栈中的对象、全局对象等。析构函数不知道释放内存需要什么(如果有的话)。
调用析构函数或任何其他成员函数之间没有区别,除了一件事 - 你不应该这样做,除非你想将对象分配与其构造和销毁分开。
内存是使用运算符 new and will be freed (deallocated) using operator delete 分配的,而不是对象的析构函数。
大家不要混淆object lifetime with dynamic memory management。
释放分配的内存不是A'
的destructor角色,不应显式调用。它只是一个成员函数,当 您的对象被销毁时,它会被调用 。它会在你调用 delete
后被销毁。
替换:
p->~A();
与:
delete p;
现在您的对象被销毁并且分配的内存被释放。