C++:如果构造函数可能抛出异常,则处理资源(参考FAQ 17.4)

mit*_*una 1 c++ exception

感谢所有的回复.

我重新格式化了我的问题,以便在包含类的构造函数抛出异常之后理解成员指针的状态

我的示例类:)

class Foo
{
public:
    Foo()
    {
       int error = 0;
        p = new Fred;

        throw error;  // Force throw , trying to understand what will happen to p
    }

   ~Foo()
    {
       if (p)
       {
           delete p;
           p = 0;
       }
     }
private:
   Fred* p;
};

int main()
{
      try
      {
         Foo* lptr = new Foo;
      }
      catch (...)
      {}
}
Run Code Online (Sandbox Code Playgroud)

类foo的consturctor会因某些随机原因而抛出异常.我知道foo的desturctor永远不会被调用,但在这种情况下,p的析构函数会被调用吗?

将p作为增强智能指针而不是指向fred的原始指针有什么不同.

谢谢.

GMa*_*ckG 6

这里有一个类似的问题,涵盖了你的要求.

在这种情况下,如果调用new失败,则保证释放指针的内存.如果调用成功,并且构造函数在此之后抛出,则会发生内存泄漏.

不会调用类的析构函数,因为该对象从未完全构造.有两种方法可以解决这个问题.

1)

在构造函数中完全管理异常:

class Foo
{
public:
    Foo()
    try
    {
        p = new p;

        throw /* something */; 
    }
    catch (...)
    {
       delete p;

       throw; //rethrow. no memory leak
    }
private:
    int *p;
};
Run Code Online (Sandbox Code Playgroud)

2)

或者使用智能指针.输入构造函数时,已构造其所有成员.并且因为当构造函数抛出并且构造了对象成员时,它们必须被破坏.智能指针修复了:

class Foo
{
public:
    Foo() :
    p(new int)
    {
        throw /* something */; 
    }
private:
    std::auto_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)