面试题答案
一键面试1. 析构函数重载与资源回收原理
在C++ 中,析构函数是一个特殊的成员函数,当对象生命周期结束时会自动调用。通过在析构函数中释放对象占用的资源,可以避免资源泄漏。对于包含不同类型资源的对象,析构函数内可分别处理每种资源的释放。
2. 对象析构顺序
- 局部对象:在其作用域结束时按声明的相反顺序析构。
- 成员对象:在包含它们的对象析构时,按声明顺序的相反顺序析构。
- 基类对象:在派生类对象析构时,先析构派生类部分,再析构基类部分。
3. 代码框架示例
#include <iostream>
#include <memory>
// 模拟网络连接类
class NetworkConnection {
public:
NetworkConnection() {
std::cout << "NetworkConnection created" << std::endl;
}
~NetworkConnection() {
std::cout << "NetworkConnection destroyed" << std::endl;
}
};
// 模拟数据库事务类
class DatabaseTransaction {
public:
DatabaseTransaction() {
std::cout << "DatabaseTransaction created" << std::endl;
}
~DatabaseTransaction() {
std::cout << "DatabaseTransaction destroyed" << std::endl;
}
};
// 包含多种资源的复杂对象
class ComplexObject {
private:
std::unique_ptr<NetworkConnection> networkConn;
std::unique_ptr<DatabaseTransaction> dbTransaction;
public:
ComplexObject() {
networkConn = std::make_unique<NetworkConnection>();
dbTransaction = std::make_unique<DatabaseTransaction>();
}
~ComplexObject() {
// 自动调用成员对象的析构函数
// 释放网络连接和数据库事务
std::cout << "ComplexObject destroyed" << std::endl;
}
};
int main() {
{
ComplexObject obj;
}
return 0;
}
4. 关键实现点
- 资源管理:使用智能指针(如
std::unique_ptr
)管理资源,确保在对象析构时自动释放资源。智能指针利用RAII(Resource Acquisition Is Initialization)机制,在构造时获取资源,析构时释放资源。 - 析构函数定义:在析构函数中手动释放那些没有被智能指针管理的资源。对于使用
new
分配的内存,在析构函数中使用delete
释放;对于文件句柄等资源,调用相应的关闭函数。 - 对象关系:了解对象之间的包含、继承等关系,确保析构顺序正确。如派生类析构时先清理自身资源,再让基类析构函数清理基类资源;包含对象先析构成员对象,再清理自身其他资源。