对于这样一个简单的类:
class X {
public:
//...
private:
int *ptr;
};
X::~X() {
delete ptr;
}
我编写了一个析构函数来释放ptr
指向的内存。现在,我想知道,如果我的析构函数保持这样,ptr
何时被实际销毁?
由于
答案 0 :(得分:2)
我认为this article可能会回答您的大部分问题
“在自动对象(本地对象)中隐式调用析构函数 已声明为auto或register,或未声明为的对象 static或extern)或临时对象超出范围。他们是 在程序终止时隐式调用构造的外部和 静态对象。使用删除时会调用析构函数 使用new运算符创建的对象的运算符。“
更具体地说:
“基类和成员的析构函数反过来调用 完成构造函数的顺序:
在析构函数之前调用类对象的析构函数 成员和基地被称为。
非析构成员的析构函数在析构函数之前调用 基类被称为。
在析构函数之前调用非虚基类的析构函数 对于虚拟基类的调用。“
答案 1 :(得分:1)
delete
调用正在删除的对象的析构函数,然后释放它占用的内存。
答案 2 :(得分:1)
析构函数将调用特定实例所在范围的末尾。
答案 3 :(得分:0)
当对象超出范围时,将销毁给定X实例的本地版本的ptr。例如:
int main()
{
X obj;
for (int i=0; i<10; i++) {
X tmp;
// do work with tmp
...
// tmp goes out of scope here
// the destructor tmp::~X will be called here, immediately after each iteration ends
}
// obj goes out of scope here
// the destructor obj::~X called when the program ends
}