析构函数的触发条件是当一个对象的生命周期结束时,即该对象被销毁时,会自动调用其析构函数。析构函数的调用时机有以下几种情况:
- 对象在栈上创建:当一个对象在栈上创建时,它的析构函数会在该对象所在的作用域结束时自动调用。
void foo() {
Animal animal;
// ...
} // animal 的析构函数会在这里自动调用
在上面的例子中,当 foo()
函数执行完毕时,animal
对象所在的作用域结束,它的析构函数会自动调用。
- 对象在堆上创建:当一个对象在堆上创建时,它的析构函数需要手动调用
delete
运算符来触发。
void foo() {
Animal* animal = new Animal();
// ...
delete animal; // animal 的析构函数会在这里手动调用
}
在上面的例子中,当 delete animal
执行时,animal
对象的析构函数会被手动调用。
- 对象作为成员变量:当一个对象作为另一个对象的成员变量时,它的析构函数会在包含它的对象的析构函数中自动调用。
class Person {
public:
~Person() {
delete animal; // animal 的析构函数会在这里自动调用
}
private:
Animal* animal;
};
void foo() {
Person person;
// ...
} // person 的析构函数会在这里自动调用,从而触发 animal 的析构函数
在上面的例子中,当 person
对象所在的作用域结束时,它的析构函数会自动调用,从而触发 animal
对象的析构函数。
需要注意的是,当一个对象被销毁时,它的成员变量的析构函数会在它自己的析构函数之前被调用,因此在编写析构函数时需要注意成员变量的销毁顺序。