CppCoreGuidelines E.13 对象的直接保管者不可抛出异常
02 August 2023
“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()
可以使得不太系统的清理过程稍稍可控。