面试题答案
一键面试在C++中,可以使用智能指针来管理动态分配的资源,以确保在异常发生时资源不泄漏。以下是实现代码示例及解释:
#include <memory>
class MyClass {
private:
std::unique_ptr<int> data;
public:
MyClass() : data(std::make_unique<int>(0)) {}
~MyClass() = default;
// 拷贝构造函数和赋值运算符重载,根据需要实现
MyClass(const MyClass& other) : data(std::make_unique<int>(*other.data)) {}
MyClass& operator=(const MyClass& other) {
if (this != &other) {
data = std::make_unique<int>(*other.data);
}
return *this;
}
};
MyClass& getMyClass() {
static std::unique_ptr<MyClass> instance;
if (!instance) {
try {
instance.reset(new MyClass());
} catch(...) {
// 这里可以进行异常处理,例如记录日志等
throw;
}
}
return *instance;
}
解释:
-
资源管理:在
MyClass
类中,使用std::unique_ptr<int>
来管理动态分配的int
类型资源data
。std::unique_ptr
是C++标准库提供的智能指针,在其生命周期结束时会自动释放所管理的资源,这确保了在MyClass
对象销毁时,data
所指向的内存会被自动释放,即使在异常情况下也不例外。 -
函数实现:在
getMyClass
函数中,使用一个静态的std::unique_ptr<MyClass>
来保存MyClass
的实例。这样可以保证整个程序中只有一个MyClass
实例(单例模式的一种变体)。当首次调用getMyClass
时,instance
为空,此时尝试创建MyClass
实例。如果创建过程中抛出异常,std::unique_ptr
会自动释放已分配的资源,从而避免内存泄漏。同时,在异常捕获块中,可以根据需要进行异常处理,然后重新抛出异常,让调用者决定如何处理。
通过上述方式,确保了在 getMyClass
函数内部抛出异常时,返回引用的 MyClass
对象的资源不会泄漏。