面试题答案
一键面试#include <iostream>
#include <fstream>
#include <memory>
class Resource {
public:
Resource(const std::string& filename) {
// 动态分配内存
data = std::make_unique<int[]>(100);
// 打开文件
file.open(filename);
if (!file) {
throw std::runtime_error("Failed to open file");
}
}
~Resource() {
// 自动释放动态分配的内存和关闭文件
file.close();
}
private:
std::unique_ptr<int[]> data;
std::ofstream file;
};
原理解释:
- 智能指针:使用
std::unique_ptr
来管理动态分配的内存。std::unique_ptr
是C++标准库提供的智能指针,它采用RAII(Resource Acquisition Is Initialization)机制。当Resource
对象被创建时,std::unique_ptr<int[]>
分配内存;当Resource
对象被销毁(无论是正常结束生命周期还是因为异常导致提前销毁),std::unique_ptr<int[]>
的析构函数会自动释放其所管理的内存,从而避免内存泄漏。 - RAII用于文件句柄:对于文件句柄,同样利用RAII机制。
std::ofstream
对象在Resource
对象的构造函数中打开文件,在Resource
对象的析构函数中关闭文件。如果在构造函数中抛出异常,Resource
对象不会完全构造成功,其析构函数会被自动调用,从而关闭已经打开的文件,避免文件句柄泄漏。