【C++】类和对象--析构函数 目录析构函数的特性何时需要显式定义析构函数对象创建时需要初始化对象销毁时同样需要善后——尤其是当对象持有动态分配的内存、文件句柄、网络连接等资源时。这个善后工作就由析构函数来完成。析构函数的特性函数名~加类名如~Stack()。无参数、无返回值因此析构函数不能重载一个类只能有一个析构函数。对象生命周期结束如离开作用域、delete对象时编译器自动调用析构函数。如果用户未显式定义析构函数编译器会生成一个默认析构函数。默认析构函数对内置类型成员不做任何处理但对自定义类型成员会调用其自身的析构函数。何时需要显式定义析构函数核心原则若类内部申请了资源动态内存、打开的文件、锁等则必须显式编写析构函数来释放这些资源若类仅包含普通数据和无需资源管理的成员则完全可以依赖编译器生成的默认析构函数。typedefintDataType;classStack{public:Stack(size_t capacity4){_a(DataType*)malloc(sizeof(DataType)*capacity);_top0;_capacitycapacity;}// 显式析构释放动态申请的内存~Stack(){if(_a){free(_a);_anullptr;_top_capacity0;}}private:DataType*_a;int_top;int_capacity;};上面Stack类在构造函数中malloc了一段内存如果在析构时不手动free销毁对象时内存就会泄漏。编译器生成的默认析构仅仅回收对象本身所占用的栈内存不会自动释放_a所指向的堆内存。如果类中包含一个Stack对象作为成员而该类本身没有显式析构编译器生成的默认析构会自动调用Stack的析构函数资源依然能得到正确释放。这就是组合对象的自动管理。classMyQueue{private:Stack _pushst;Stack _popst;int_size0;};// MyQueue 的默认析构会调用每个 Stack 成员的析构无需手动写析构函数与构造函数的配对使用构成了C资源管理的基础——即广为人知的RAIIResource Acquisition Is Initialization惯用法。掌握了构造和析构我们将在下一篇探讨如何安全地复制对象——拷贝构造函数。