面试题答案
一键面试1. std::unique_ptr
在异常情况下的资源管理原理
std::unique_ptr
是C++标准库中用于管理动态分配资源的智能指针。它采用了RAII(Resource Acquisition Is Initialization)技术,即在对象构造时获取资源,在对象析构时释放资源。当函数中抛出异常时,栈会展开,局部对象会按其构造顺序的相反顺序被析构。std::unique_ptr
的析构函数会自动释放它所管理的资源,从而确保在异常发生时资源能被正确释放,避免内存泄漏。
2. 示例代码:不使用std::unique_ptr
#include <iostream>
// 模拟一个可能抛出异常的函数
void functionWithoutUniquePtr() {
int* ptr = new int(42);
try {
// 一些可能抛出异常的操作
if (true) {
throw std::runtime_error("Exception thrown");
}
delete ptr;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
// 如果异常发生在delete之前,ptr指向的内存将泄漏
}
}
3. 示例代码:使用std::unique_ptr
#include <iostream>
#include <memory>
// 模拟一个可能抛出异常的函数
void functionWithUniquePtr() {
std::unique_ptr<int> ptr(new int(42));
try {
// 一些可能抛出异常的操作
if (true) {
throw std::runtime_error("Exception thrown");
}
// 无需手动delete,离开作用域时unique_ptr会自动释放资源
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
}
// 即使异常发生,ptr所指向的内存也会被正确释放
}
4. 总结
- 不使用
std::unique_ptr
:在可能抛出异常的函数中,如果异常发生在手动释放资源(如delete
)之前,资源将无法释放,导致内存泄漏。因为delete
语句不会被执行,控制权直接跳转到catch
块。 - 使用
std::unique_ptr
:无论函数正常结束还是因异常而终止,std::unique_ptr
的析构函数都会被调用,自动释放其所管理的资源。这确保了在异常情况下资源管理的安全性和可靠性,遵循了RAII原则。