C++ - 避免内存泄漏异常

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块中.