面试题答案
一键面试- 资源管理策略:
- RAII(Resource Acquisition Is Initialization):这是C++中管理资源的常用方法。通过将资源封装在一个对象中,利用对象的构造函数获取资源,析构函数释放资源。这样,无论函数正常结束还是因异常退出,资源都能得到正确释放。
- 智能指针:对于堆内存,使用智能指针(
std::unique_ptr
、std::shared_ptr
)。std::unique_ptr
适用于独占所有权的资源,std::shared_ptr
适用于共享所有权的资源。智能指针会在其析构时自动释放所管理的内存。 - 自定义资源管理类:对于非内存资源(如文件句柄),可以创建自定义的资源管理类,在构造函数中获取资源(如打开文件),析构函数中释放资源(如关闭文件)。
- 示例代码:
#include <iostream>
#include <memory>
#include <fstream>
// 自定义文件句柄管理类
class FileHandle {
public:
FileHandle(const std::string& filename) : file(filename) {
if (!file) {
throw std::runtime_error("Failed to open file");
}
}
~FileHandle() {
if (file.is_open()) {
file.close();
}
}
std::ofstream& getFile() {
return file;
}
private:
std::ofstream file;
};
// 指针函数,可能抛出异常并涉及动态资源
std::unique_ptr<int> pointerFunction() {
std::unique_ptr<int> data(new int(42));// 使用std::unique_ptr管理堆内存
FileHandle file("test.txt");// 使用自定义类管理文件句柄
// 模拟可能抛出异常的操作
if (true) {
throw std::runtime_error("Some error occurred");
}
return data;
}
int main() {
try {
auto result = pointerFunction();
std::cout << "Result: " << *result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
在上述代码中:
std::unique_ptr<int>
用于管理动态分配的整数内存。即使pointerFunction
函数因异常退出,std::unique_ptr
的析构函数也会自动释放该内存。FileHandle
类封装了文件句柄的获取(打开文件)和释放(关闭文件)操作。在pointerFunction
函数中,FileHandle
对象在栈上创建,无论函数正常结束还是因异常退出,其析构函数都会确保文件被正确关闭。
这样就有效地避免了内存泄漏和资源泄漏。