02 August 2023

C++ 核心指南目录

“Never throw while being the direct owner of an object”

理由

会导致内存泄漏。

例子

void leak(int x)   // don't: might leak
{
    auto p = new int{7};
    if (x < 0) throw Get_me_out_of_here{};  // might leak *p
    // ...
    delete p;   // we might never get here
}

这里避免内存泄漏的一个方法是利用资源句柄一致性地处理资源:

void no_leak(int x)
{
    auto p = make_unique<int>(7);
    if (x < 0) throw Get_me_out_of_here{};  // will delete *p if necessary
    // ...
    // no need for delete p
}

其他更好的解决方案是使用局部变量,从而避免指针的使用:

void no_leak_simplified(int x)
{
    vector<int> v(7);
    // ...
}

注意

如果你有一个局部的“东西”需要进行清理,但是又没有对应的析构函数处理。那就必须在抛出异常之前进行清理。有时候, finally() 可以使得不太系统的清理过程稍稍可控。