C++;RAII与多态性兼容性 由于RaII,C++中没有最后的块。现在,如果我有一个指针对象,并且其中一个方法发生异常,这个对象将如何被删除?。下面是我编写的示例代码 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; } A类 { 公众: () { cout

C++;RAII与多态性兼容性 由于RaII,C++中没有最后的块。现在,如果我有一个指针对象,并且其中一个方法发生异常,这个对象将如何被删除?。下面是我编写的示例代码 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; } A类 { 公众: () { cout,c++,raii,C++,Raii,RAII的要点是使用具有自动存储持续时间的变量来实现异常安全。如果需要具有动态存储持续时间的对象,您可以使用智能指针,或者您可以简单地创建一个具有自动存储持续时间的对象: try { B bobj; A *b = &bobj; b->mymethod(); } catch (int i) { cout<<"exception"; } 试试看 { B bobj; A*b=&bobj; b->mymethod(); } 捕获(int

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

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

    b->mymethod();

}

catch (int i)
{
    cout<<"exception";
}
试试看
{
B bobj;
A*b=&bobj;
b->mymethod();
}
捕获(int i)
{

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

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

    b->mymethod();

}

catch (int i)
{
    cout<<"exception";
}
试试看
{
B bobj;
A*b=&bobj;
b->mymethod();
}
捕获(int i)
{

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

  • 如果你想要独特的资产, 使用。这将是不可复制的
  • 如果您想要共享资产, 使用。这将做浅拷贝
  • 如果您想要值语义, 使用
    clone\u ptr
    。这将进行深度复制。
    它来自下一个标准,但是 你可以找到它

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

  • 如果你想要独特的资产, 使用。这将是不可复制的
  • 如果您想要共享资产, 使用。这将做浅拷贝
  • 如果您想要值语义, 使用
    clone\u ptr
    。这将进行深度复制。
    它来自下一个标准,但是 你可以找到它

它不会。你没有使用RAII。使用智能指针。

它不会。你没有使用RAII。使用智能指针。

那么
独特的ptr呢?
析构函数应该是虚拟的。当你可以写=std::make_unique();并且让它自己清理(也不需要删除B)时,就不需要写“new B()”。在这个例子中,也不需要
new
。只要
bb;
unique\u ptr
呢?而且
A
析构函数应该是虚拟的。当你可以写=std::make_unique(),就不需要写“new B()”,让它自己清理一下(也不需要删除B)在这个例子中,也不需要
new
。只要
bb;
那个建议看起来很初步。那个建议看起来很初步。