C ++ RAII和多态性兼容性

妖怪

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

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)。

sp2danny

首先,所有多态类型都应具有虚拟析构函数
其次,当您使用拥有原始指针时,基本上可以禁用RAII。
解决方案是使用智能指针:

  • 如果您想要独特的资产,请使用unique_ptr这将是不可复制的。
  • 如果要共享资产,请使用shared_ptr这将进行浅表复制。
  • 如果您想使用价值语义,请使用clone_ptr这将进行深度复制。
    来自下一个标准,但是您可以在这里找到它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章