面试题答案
一键面试- 原始代码
Resource res;
时析构函数调用过程:- 当进入
func
函数,执行Resource res;
时,调用Resource
的构造函数,输出Resource acquired
。 - 当执行到
throw std::runtime_error("Some error");
时,由于异常抛出,栈展开。func
函数中的局部变量res
的生命周期结束,调用Resource
的析构函数,输出Resource released
。 - 然后在
main
函数的try - catch
块中捕获到异常,输出Exception caught
。
- 当进入
- 改为
Resource* res = new Resource();
且不手动delete res;
时析构函数调用情况及原因:- 调用情况:
Resource
的析构函数不会被调用。 - 原因:当执行
Resource* res = new Resource();
时,在堆上分配了内存并调用Resource
的构造函数,输出Resource acquired
。当执行throw std::runtime_error("Some error");
时,异常抛出,栈展开。但是res
是一个指针,它是栈上的局部变量,其生命周期结束时,只是指针本身被销毁,而指针指向的堆上的Resource
对象并没有被释放,因为没有调用delete res;
。所以Resource
的析构函数不会被调用,这就导致了内存泄漏。
- 调用情况: