stack-unwinding是否释放在堆上分配的内存?

时间:2014-08-10 22:04:53

标签: c++ exception memory-management memory-leaks exception-handling

如果我有以下内容:

try{
    int* i = new int(5);
    //exception thrown here
}
catch(const exception& e){
    //Do I need to delete the heap allocation here?
}

在抛出异常之前不久进行堆分配,作为堆栈展开的一部分,堆内存会被回收吗?或者是否会出现内存泄漏,我希望在catch()语句中处理此问题?

2 个答案:

答案 0 :(得分:3)

不,在堆栈展开期间只会调用析构函数,不会有“手动释放”或类似的东西。你int会泄漏。为避免此类问题,请使用RAII,例如,您可以使用std::vector<int>代替原始C样式数组或std::unique_pointer作为示例。一般认为,避免“裸”new并仅在std::vector std::unique_pointer {{1}}等资源处理程序的实现中使用它是一种良好做法。你描述的问题是其中一个更大的原因。

答案 1 :(得分:0)

堆栈展开或自动对接产生放弃对象,意味着堆栈中没有任何引用。然后放弃对象将被GC清理并将内存恢复到JAVA中的OS。 但是在C ++中需要注意内存管理,在这种情况下它会泄漏内存,你必须明确处理 这是我的观点:

delete i;         
  system("PAUSE"); 

如果你能去这里更好.. C ++ common memory leak problem