我读了Paul Deitel所著的《C++ How to Program 第8版》。在第645页有这样一句话:
输出结果为:
这表明B的析构函数未被调用,这似乎与上面的声明相矛盾。
我的代码是否正确验证了该语句?如果不是,我应该如何修改它?如果是,这是否意味着该语句是错误的?
为了验证这个说法,我编写了以下代码:当在new表达式中创建一个对象时,如果其构造函数抛出异常,则会释放该对象的动态分配内存。
#include <iostream>
#include <exception>
#include <memory>
class A{
public:
A(){std::cout << "A is coming." << std::endl;}
~A(){std::cout << "A is leaving." << std::endl;}
};
class B
{
public:
B()
{
std::cout << "B is coming." << std::endl;
A b;
throw 3;
}
~B(){std::cout << "B is leaving." << std::endl;}
};
int main(void)
{
try
{
std::shared_ptr<B> pi(new B);
}
catch(...)
{
std::cout << "Exception handled!" << std::endl;
}
}
输出结果为:
B is coming.
A is coming.
A is leaving.
Exception handled!
这表明B的析构函数未被调用,这似乎与上面的声明相矛盾。
我的代码是否正确验证了该语句?如果不是,我应该如何修改它?如果是,这是否意味着该语句是错误的?