如果我有以下内容:
try{
int* i = new int(5);
//exception thrown here
}
catch(const exception& e){
//Do I need to delete the heap allocation here?
}
在抛出异常之前不久进行堆分配,作为堆栈展开的一部分,堆内存会被回收吗?或者是否会出现内存泄漏,我希望在catch()
语句中处理此问题?
答案 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