抛出异常时如何清除动态内存?

时间:2016-01-25 23:02:18

标签: c++ exception-handling

void a(){
    int *ptr = new int(10);
    throw 1;        // throwing after memory allocation
    delete ptr;
}
int main(){
    try{
        a();
    } catch(...){
        cout << "Exception"<<endl;
    }
 }

这个程序会导致内存泄漏,有没有办法清除分配的动态内存..?

2 个答案:

答案 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

经验法则:如果您的代码有deletedelete[]或裸newnew[],则可能有错误。