gpt4 book ai didi

c++ - 行为差异(GCC 和 Visual C++)

转载 作者:IT老高 更新时间:2023-10-28 23:14:58 25 4
gpt4 key购买 nike

考虑下面的代码。

#include <stdio.h>
#include <vector>
#include <iostream>

struct XYZ { int X,Y,Z; };
std::vector<XYZ> A;

int rec(int idx)
{

int i = A.size();
A.push_back(XYZ());
if (idx >= 5)
return i;

A[i].X = rec(idx+1);

return i;
}

int main(){
A.clear();
rec(0);
puts("FINISH!");

}

我无法弄清楚代码在 Linux(使用的 IDE:Code::Blocks)上出现段错误的原因,而在 Windows(使用的 IDE:Visual C++)上却没有。

当我使用 Valgrind 来检查实际问题时,我得到了 this output .

我在四个不同的地方得到了 Invalid write of size 4。那为什么我使用Visual C++时代码没有崩溃?

我错过了什么吗?

最佳答案

rec() 的递归调用可能会在您为其赋值时修改 vector 。

如果替换会发生什么

A[i].X = rec(idx+1);

int tmp = rec(idx+1);
A[i].X = tmp;

?

另外,总结一下有用的注释:= 操作的操作数计算顺序未指定,并且由于未预先分配 vector ,因此在递归调用 期间可能会发生多次调整大小rec(),从而使 vector 中值的任何迭代器无效。

关于c++ - 行为差异(GCC 和 Visual C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2778889/

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