如果我有以下内容:
try{
int* i = new int(5);
//exception thrown here
}
catch(const exception& e){
//Do I need to delete the heap allocation here?
}
堆分配是在抛出异常之前不久进行的,作为堆栈展开的一部分,堆内存会被回收吗?还是会出现内存泄漏,我应该在 catch()
语句中处理这个问题?
最佳答案
不,在堆栈展开期间只会调用析构函数,不会有“手动释放”或类似的东西。你int
会泄漏。为避免此类问题,请使用 RAII,例如,您可以使用 std::vector<int>
而不是原始的 C 风格数组或 std::unique_pointer
以你为例。通常认为避免“裸露”是好的做法new
s 并且仅在资源处理程序的实现中使用它,如 std::vector
的 std::unique_pointer
.您描述的问题是其中一个更大的原因。
关于c++ - 堆栈展开是否会释放在堆上分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233449/