具有意外行为的智能指针

时间:2018-12-15 06:17:41

标签: c++11 smart-pointers unique-ptr auto-ptr

在浏览智能指针时,我经历了以下代码。

按预期工作。

#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时,它却没有按预期表现。

谢谢。

0 个答案:

没有答案