面试题答案
一键面试RAII基本原理
RAII(Resource Acquisition Is Initialization)机制核心在于将资源获取和对象生命周期绑定。当一个对象被创建时(初始化阶段),它会获取所需资源(如内存、文件句柄、锁等);当对象生命周期结束(销毁阶段,例如离开作用域或被显式删除)时,其析构函数会自动释放这些资源。这样确保了资源在不再需要时能被及时释放,有效避免资源泄漏。
实际编程中使用RAII机制的场景
- 内存管理:
- 在C++中,传统的
new
和delete
操作需要手动配对使用,很容易因代码逻辑复杂而导致内存泄漏。使用RAII封装内存管理可避免该问题。例如,std::unique_ptr
就是RAII的典型应用。
- 在C++中,传统的
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructed" << std::endl; }
~MyClass() { std::cout << "MyClass destructed" << std::endl; }
};
void memoryManagementWithRAII() {
std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();
// 当ptr离开作用域,MyClass对象会自动被释放
}
- 文件操作:
- 对文件的操作需要打开文件(获取资源),操作完成后关闭文件(释放资源)。
std::fstream
类遵循RAII机制。
- 对文件的操作需要打开文件(获取资源),操作完成后关闭文件(释放资源)。
#include <fstream>
void fileOperationWithRAII() {
std::ofstream file("example.txt");
if (file.is_open()) {
file << "This is an example." << std::endl;
}
// 当file离开作用域,文件会自动关闭
}
- 线程同步 - 锁管理:
- 在多线程编程中,使用互斥锁(
std::mutex
)保护共享资源。std::lock_guard
和std::unique_lock
是基于RAII的锁管理类。
- 在多线程编程中,使用互斥锁(
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void printID(int id) {
std::lock_guard<std::mutex> guard(mtx);
std::cout << "thread " << id << '\n';
// 当guard离开作用域,互斥锁会自动解锁
}