111*_*001 0 c++ pointers memory-leaks memory-management exception-handling
假设你有一些像这样的代码:
void myFunction()
{
myClass * mine = new myClass();
// body of function
delete mine;
}
Run Code Online (Sandbox Code Playgroud)
如果在函数体内抛出异常,delete则永远不会调用异常并导致内存泄漏.除了使用其中的任何托管指针之外,缓解此问题的最佳方法是什么<memory>.
jua*_*nza 11
使用RAII.有很多方法可以做到这一点,最好的办法是使用久经考验的解决方案,比如像智能指针std::unique_ptr<myClass>或boost::scoped_ptr<myClass>.
如果您想自己完成RAII解决方案的实施,可以采用范围保护的形式:
struct guard
{
myClass* ptr;
guard(myClass* p) : ptr(p) {}
~guard() { delete ptr; }
guard(const guard&) = delete;
guard& operator=(const guard&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
请注意,RAII要求代码在某个级别的try块中.