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
RAII的要点是使用具有自动存储持续时间的变量来实现异常安全。如果需要具有动态存储持续时间的对象,您可以使用智能指针,或者您可以简单地创建一个具有自动存储持续时间的对象: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
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;
那个建议看起来很初步。那个建议看起来很初步。