由于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)。
答案 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
。这将做深刻的复制。