C ++ RAII和多态兼容性

时间:2016-03-14 11:26:05

标签: c++ raii

由于RAII,C ++中没有finally块。现在,如果我有一个指针对象并且其中一个方法发生异常,该对象将如何被删除?这是我编写的示例代码。

class A
{
public:
    A()
    {
        cout<<"I am inside A\n";
    }

    virtual void mymethod()
    {
        throw 0;
    }

    virtual ~A()
    {
        cout<<"A destroyed\n";
    }
};

class B : public A
{
public :
    //A a;

    B()
    {
        cout<<"I am inside B \n";
    }

    virtual void mymethod()
    {
        throw 0;
    }

    ~B()
    {
        cout<<"B destroyed\n";
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        A *b = new B();

        b->mymethod();

        delete b;
    }

    catch (int i)
    {
        cout<<"exception";
    }
    return 0;
}

现在在此如何删除指针对象(b)。

3 个答案:

答案 0 :(得分:3)

它没有赢。您未使用RAII 。使用智能指针。

答案 1 :(得分:0)

RAII的要点是使用具有自动存储持续时间的变量来实现异常安全。如果需要动态存储持续时间的对象,可以使用智能指针,或者只需创建一个具有自动存储持续时间的对象即可:

try
{
    B bobj;
    A *b = &bobj;

    b->mymethod();

}

catch (int i)
{
    cout<<"exception";
}

当堆栈由于异常而展开时,所有具有自动存储持续时间的变量都被正确销毁,因此智能指针可以在其析构函数中释放该对象,在此示例中,对象bobj也将是被摧毁了。

答案 2 :(得分:0)

首先,所有多态类型都应该有virtual destructors
其次,当你使用拥有原始指针时,你基本上禁用RAII。
解决方案是使用智能指针:

  • 如果你想要一个独特的资产, 使用unique_ptr。这不可复制。
  • 如果您想要共享资源, 使用shared_ptr。这将做浅拷贝。
  • 如果你想要价值语义, 使用clone_ptr。这将做深刻的复制。
    它来自下一个标准,但是 你可以找到它here