面试题答案
一键面试需求产生场景
- 多种资源类型:当一个类管理多种不同类型的资源时,每种资源可能需要不同的释放逻辑。例如,一个类既管理动态分配的内存,又管理文件句柄,可能希望针对内存释放和文件关闭有不同的“析构”方式。
- 对象状态相关:对象处于不同状态时,资源释放方式不同。比如一个网络连接类,在正常关闭连接和异常关闭连接时,可能需要不同的清理逻辑。
替代方案
可以通过定义不同的清理函数,然后在析构函数中根据对象的状态调用相应的清理函数。
代码示例
#include <iostream>
#include <string>
#include <memory>
class ResourceManager {
public:
ResourceManager() : state(0), data(nullptr) {}
~ResourceManager() {
if (state == 0) {
cleanUpNormal();
} else {
cleanUpAbnormal();
}
}
void allocateData() {
data = std::make_unique<int>(42);
}
void setAbnormalState() {
state = 1;
}
private:
void cleanUpNormal() {
if (data) {
std::cout << "Cleaning up normal data: " << *data << std::endl;
data.reset();
}
}
void cleanUpAbnormal() {
if (data) {
std::cout << "Cleaning up abnormal data. Ignoring value: " << *data << std::endl;
data.reset();
}
}
int state;
std::unique_ptr<int> data;
};
int main() {
ResourceManager rm;
rm.allocateData();
ResourceManager rmAbnormal;
rmAbnormal.allocateData();
rmAbnormal.setAbnormalState();
return 0;
}
在上述代码中,ResourceManager
类管理一个int
类型的动态分配资源。根据state
成员变量的值,析构函数会调用不同的清理函数cleanUpNormal
或cleanUpAbnormal
。这样就模拟了类似析构函数重载的功能,根据不同情况执行不同的资源释放逻辑。