在构造函数中捕获异常

use*_*214 5 c++ exception-handling

以下示例留下可能的内存泄漏,因为析构函数不会针对在其构造函数运行期间处理异常的对象运行.我在哪里处理这个内存泄漏?

#include <exception>

class MyClass {

public:
       MyClass() 
       {
           c = new char[5];
           throw std::runtime_error("test");
       }

      ~MyClass ()
       {
           delete[] c;
       }

private:
    char *c;
};

int main()
{
    try 
    {
        MyClass Obj;

    } 
    catch (std::runtime_error)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

Ed *_*eal 6

在构造函数中捕获异常,整理(释放内存),然后在没有内存泄漏的情况下抛出异常.


Alo*_*ave 5

你最好使用RAII,在这种情况下智能指针是特定的.

或者,您可以使用两阶段构建策略.

您可以始终try-catch在构造函数体内使用封闭块,并为您动态分配的所有资源显式调用delete,但考虑到您有n动态分配的资源数量的情况,显式跟踪您需要的每个资源变得非常麻烦catch在这种情况下,解除分配,RAII为您提供最佳解决方案,因为每个资源都隐含地处理自己的释放,您不需要有跟踪每个资源的开销.

boost::scoped_ptr或者std::tr1::scoped_ptr适合这种情况而不是任何原始指针.

  • 什么要求这个downvote?RAII是解决这个问题的最佳方式,如果有人说不正确的话.如果你觉得对Downvote有责任,那么有足够的责任感向我们解释原因吗?如果你不能&只是*觉得*这是错的,那么你就没有足够的资格进行贬低,让其他人这样做. (2认同)
  • 也许暗示是建议"两阶段建设"?这听起来对我来说是个坏主意. (2认同)