class book
{
int*d;
char ch;
public:book()
{
try
{
d=new int(23);
throw 'A';
ch='B';
}
catch(char c)
{
delete d;
cout<<"caught exception in constructor\n";
}
}
void show()
{
cout<<*d<<endl<<ch;
}
};
main()
{
book b;
b.show();
}
当构造函数中出现异常时,我们应该释放分配的内存以避免内存泄漏。但是在上面的代码中,我试图释放分配的内存,即使这样它也显示正确的答案,即*的值d显示为23.为什么会这样?
答案 0 :(得分:1)
在指针删除后使用指针的指示物是未定义的行为。
价值尚未清除或改变并非不自然。但是如果被清除或改变也不是不自然的。如果程序崩溃,那就不自然了。
在其他新闻中......
抛出char
或其他基本值可能会造成麻烦,或至少阻止记录合适的消息。通常,期望是源自std::exception
的例外,例如std::runtime_error
或std::system_error
。
在构造函数中捕获异常本身是可以的,但是当构造函数失败时不抛出是灾难的邀请 - 实例化代码将留下无效的对象。
为了便于在失败的构造函数中进行清理,请使用智能指针,标准集合类或自定义RAII(在适当定义的类型的析构函数中进行清理)。
在没有结果类型的情况下声明main
在C ++中无效,C ++从未支持隐式int
。
关于样式,public:book()
看起来像应用于单个项目的访问说明符,如Java和C#。在C ++中,访问说明符启动具有给定访问权限的区域。因此,将它在视觉上与单一的东西结合起来是不自然的。