对象在超出范围时是否被销毁,因为它们已引发异常.C++
Are objects destroyed when they go out of scope because an exception has been thrown. C++
我读到一旦抛出异常,超出范围的对象将被销毁。所以我写了一个代码来测试它。
#include "stdafx.h"
#include <iostream>
using namespace std;
class E {
public:
int v = 0;
};
void f() {
E e;
E *pointer = &e;
e.v = 7;
throw pointer;
}
int main(void) {
E* MainPointer = new E;
try {
f();
}
catch (E* e) {
cout << e -> v; //was executed
MainPointer = e;
}
cout << MainPointer->v; //was executed
system("pause");
return 0;
}
输出是 77,这意味着捕获块和最终 cout 都被执行了。但是,我预计在最后的cout会出现内存错误,因为MainPointer 指向的对象现在应该已被释放。
有人可以澄清为什么在 f() 中声明的对象没有被解除分配。
你有两个误解,共同创造了这个问题。事实是
- 根据标准,当物体的寿命结束时,物体将被销毁。由块内声明的变量呈现的自动存储会在块退出时被销毁,因为标准是这样说的。
- 您无法通过检查代码是否有效来检查是否会发生未定义的行为。未定义的行为包括正确(预期)执行程序。
根据(1)在f()
内部声明的局部变量e
被销毁。根据(2)您可以访问释放的内存,并且可能会获得正确的值。检查e
是否被销毁的唯一方法是定义析构函数,以便class E
能够跟踪它。将调用析构函数。
在异常期间发生堆栈展开。堆栈上分配的对象将被销毁,但堆上分配的对象不会operator new
。您必须手动销毁它们或将它们包装成unique_ptr。
相关文章:
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 程序无法启动,因为缺少 libmpc-3.dll
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- C++ 程序不会因为内存而终止
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- 无法使用 openssl 服务器,因为密码已过时...什么的...ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- "this"关键字在C++中的实现限制,因为它与危险但功能示例有关
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 如何读取指针的值,因为这个指针是函数的返回?
- 无法加载 QML 插件:无法保护模块,因为它从未注册过
- 无法使用犰狳运行编译的 cpp 代码,因为 dyld:库未加载
- system() 无法运行我的程序,因为空间
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 我必须构建我的项目 2 次,第一次失败,因为它无法打开库
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00