void a(){
int *ptr = new int(10);
throw 1; // throwing after memory allocation
delete ptr;
}
int main(){
try{
a();
} catch(...){
cout << "Exception"<<endl;
}
}
这个程序会导致内存泄漏,有没有办法清除分配的动态内存..?
答案 0 :(得分:5)
使用智能指针。
void a(){
auto ptr = std::make_unique<int>(10);
throw 1;
}
无论是否抛出异常, ptr
都将被释放。 (如果异常被抛出而未被捕获,则可能无法解除分配,但程序无论如何都会崩溃。)
答案 1 :(得分:2)
在C ++中,您可以使用名为RAII的概念。
简而言之:不要不必要地使用动态分配的内存,所以在你的情况下
void a(){
int i;
throw 1; // No dynamic allocation, no problem
}
没有new
,如果您不能这样做,请让一些基于范围的所有者处理生命周期:
void a(){
auto ptr = std::make_unique<int>(10);
throw 1; // Allocation handled properly, no problem
}
当它超出范围时,这将自动删除int
。
经验法则:如果您的代码有delete
或delete[]
或裸new
或new[]
,则可能有错误。