gpt4 book ai didi

c++ - 为什么此代码仅在零售中导致崩溃?

转载 作者:行者123 更新时间:2023-11-30 21:48:31 25 4
gpt4 key购买 nike

此代码显然存在问题,但它仅在零售中而不是在调试中导致访问冲突。有什么具体原因吗?编译器是VS 2008。假设启用= true

void parse(bool enabled)
{
char* p = NULL;
if (enabled)
{
char a[100] = 'jsajas';
p = &a;
}
if (p != NULL)
{
p[0] = 'a';
}
}

编辑:我知道失败的原因。我想知道是什么导致它在零售中崩溃而不是在调试中崩溃。内存的处理方式有何不同。

编辑:稍微编辑代码以使其更清楚我的问题是什么。

编辑:恢复旧代码并在下面添加新代码,因为人们似乎不喜欢它。抱歉造成困惑。我的目的是真正理解在堆中分配时的问题。

void parse(bool enabled)
{
char* p = NULL;
if (enabled)
{
char* a = new char[100];
a[0] = 'a';
p = a;
}
if (p != NULL)
{
p[0] = 'a';
}
}

最佳答案

在控制流退出声明变量的范围后,您正在访问变量(数组a)。这是未定义的行为

MSVC 可以生成非常不同的代码,具体取决于您使用的是“发布”还是“调试”开关集。有可能是:

  • 在 Debug模式下,编译器会在堆栈上为函数内任何位置声明的所有变量分配足够的空间
  • 在 Release模式下,编译器生成的代码会在进入和退出作用域时更改堆栈上分配的内存量

为了找到答案,您可以查看生成的汇编代码。

关于c++ - 为什么此代码仅在零售中导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6619216/

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