Проходя через интеллектуальные указатели, я пробежал следующий код.
Работает, как и ожидалось.
#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 есть исключение, т.е.Я пытаюсь разделить на ноль, так как я использую здесь auto_ptr, хотя есть исключение, выделенный объект для класса Double будет уничтожен, и деструктор будет вызван, как и ожидалось.Но я столкнулся с одной проблемой, когда я изменил фрагмент кода, вместо того, чтобы делить 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;
}
Может кто-нибудь помочь мне понять это, почему оно не ведет себя так, как ожидалось, когда я жестко кодирую 1/0 в методе setDouble.
Спасибо.