首页 > 解决方案 > 具有意外行为的智能指针

问题描述

当我浏览智能指针时,我运行了以下代码。

按预期工作。

#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;
}

谁能帮助我理解这一点,为什么当我在 setDouble 方法中硬编码 1/0 时它的行为不符合预期。

谢谢你。

标签: c++11smart-pointersunique-ptrauto-ptr

解决方案


推荐阅读