c++11 - 具有意外行为的智能指针
问题描述
当我浏览智能指针时,我运行了以下代码。
按预期工作。
#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 时它的行为不符合预期。
谢谢你。
解决方案
推荐阅读
- extjs - 切换选项卡时 EXTJS 存储相关错误:ext-all-debug.js:53117 Uncaught TypeError: Cannot read property 'isSynchronous' of null
- html - 在文本下方创建下划线
- ansible - 为什么使用 OpenStack-Ansible 安装时管理容器没有收到 IP-s?
- cuda - 删除 CUDA 10.0 并在 Ubuntu 18.04 上安装 CUDA 9.2
- python - 在 gnu radio 中为 python 块设置元素数
- php - 几种形式的逻辑,Laravel
- asp.net - 将资源文件用于 HTML 中的元内容
- r - stat_density2d - 图例是什么意思?
- powershell - 在 PowerShell 中获取值和连接的问题
- regex - 具有两个参数的 Htaccess 规则