在浏览智能指针时,我经历了以下代码。
按预期工作。
#include <iostream>
#include <memory>
using namespace std;
class Double
{
public:
Double(double d = 0) : dValue(d) { cout << "constructor: " << dValue << endl; }
~Double() { cout << "destructor called with exception: " << dValue << endl; }
void setDouble(double d) { dValue = d;
float temp= d/0;
cout<<"Error\n";
}
private:
double dValue;
};
int main()
{
auto_ptr<Double> ptr(new Double(3.14));
(*ptr).setDouble(6.28);
return 0;
}
如您所见,setDouble方法中存在一个例外,即我正在尝试除以零,因为即使有例外,为Double类分配的对象也会被销毁,并且析构函数将被调用,因为我在这里使用了auto_ptr这是预期的。 但是,当我更改代码段时遇到了一个问题,不是将d除以零,而是使用硬代码值1并将其除以零,在这种情况下,这也是一个例外,但是由于我使用的是自动指针,期望删除分配的对象,令我惊讶的是,发生了异常,并且Double的对象未销毁。
异常行为。
#include <iostream>
#include <memory>
using namespace std;
class Double
{
public:
Double(double d = 0) : dValue(d) { cout << "constructor: " << dValue << endl; }
~Double() { cout << "destructor called with exception: " << dValue << endl; }
void setDouble(double d) { dValue = d;
float temp= 1/0;
cout<<"Error\n";
}
private:
double dValue;
};
int main()
{
auto_ptr<Double> ptr(new Double(3.14));
(*ptr).setDouble(6.28);
return 0;
}
任何人都可以帮助我理解这一点,为什么当我在setDouble方法中硬编码1/0时,它却没有按预期表现。
谢谢。