умный указатель с неожиданным поведением - PullRequest
0 голосов
/ 15 декабря 2018

Проходя через интеллектуальные указатели, я пробежал следующий код.

Работает, как и ожидалось.

#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.

Спасибо.

...