简述C++类什么时候会析构 ?
参考答案:
在C++中,类的析构函数(destructor)会在以下情况被调用:
- 局部对象销毁:当函数返回时,其内部创建的局部对象会被销毁,此时会调用相应的析构函数。
void func() {
MyClass obj; // 当func函数返回时,obj的析构函数会被调用
}
- 静态对象销毁:当程序结束运行时,全局或静态对象会被销毁,相应的析构函数会被调用。
static MyClass obj; // 当程序结束时,obj的析构函数会被调用
- 动态分配的对象销毁:当使用
delete
操作符释放动态分配的对象时,对象的析构函数会被调用。
MyClass* obj = new MyClass; // 动态分配对象
delete obj; // 释放对象,此时会调用obj的析构函数
- 临时对象销毁:当临时对象(例如,在表达式中创建的对象)的生命周期结束时,其析构函数会被调用。
MyClass obj = MyClassFunction(); // 当函数返回时,返回的临时对象的析构函数会被调用
- 类的成员对象销毁:当包含类的成员对象的类的实例被销毁时,成员对象的析构函数会首先被调用。
class Outer {
MyClass inner;
public:
~Outer() {
// 在Outer的析构函数被调用时,首先会调用inner的析构函数
}
};
- 容器销毁:当STL容器(如
std::vector
、std::list
等)被销毁时,容器中存储的对象的析构函数会被调用。
std::vector<MyClass> vec;
vec.push_back(MyClass()); // 添加对象到容器
// 当vec被销毁时,其内部存储的对象的析构函数会被调用
请注意,析构函数的调用顺序与构造函数的调用顺序相反。如果对象的析构函数抛出异常,std::terminate
会被调用,程序会异常终止。因此,析构函数应确保不抛出异常,或者至少应该捕获并处理它们。
学习笔记