gpt4 book ai didi

c++ - 将数组本地抛出到 try block

转载 作者:IT老高 更新时间:2023-10-28 22:35:15 27 4
gpt4 key购买 nike

来自 C++ Primer 18.1.1:

If the [thrown] expression has an array or function type, the expression is converted to its corresponding pointer type.

这个程序怎么能正确输出9876543210 (g++ 5.2.0)?

#include <iostream>
using namespace std;

int main(){

try{
int a[10] = {9,8,7,6,5,4,3,2,1,0};
throw a;
}
catch(int* b) { for(int i = 0; i < 10; ++i) cout << *(b+i); }

}

从引用中,throw a 将创建一个类型为 int* 的异常对象,它是指向数组第一个元素的指针。但是当我们退出 try block 并进入 catch 子句时, a 的数组元素肯定会被破坏,因为我们改变了 block 范围?在 catch 子句期间,我是误报还是数组元素“单独存在”(未删除)?

最佳答案

取消对悬空指针的引用是未定义的行为。

当程序遇到未定义的行为时,它可以自由地做任何事情。这包括崩溃和让守护进程飞出你的 Nose ,但它也包括做你期望的任何事情。

在这种情况下,通常不会检查会覆盖该部分内存并访问堆栈指针(在其下方,因为堆栈在大多数平台上向下增长)的干预操作。

所以是的,这是一个误报。内存不再保证包含这些值,也不能保证完全可以访问,但它仍然恰好包含它们并且可以访问。

另请注意,gcc 优化因依赖于不调用未定义行为的程序而臭名昭著。通常,如果您有未定义的行为,未优化的版本似乎可以工作,但是一旦您打开优化,它就会开始做一些完全出乎意料的事情。

关于c++ - 将数组本地抛出到 try block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com