gpt4 book ai didi

c++ - 数组赋值仅适用于 C++ 中的中间变量

转载 作者:行者123 更新时间:2023-11-28 06:27:58 27 4
gpt4 key购买 nike

我有一个奇怪的问题,数组赋值只有在我使用中间变量时才有效。这是程序的设置:

struct A {
int values[4];
};

std::vector<A> items;

items vector 在一个类中,定义在它的头文件中。该 vector 在类构造期间填充有“A”结构。 values 数组保持原样。在.cpp文件中的一个函数中,填充values数组的代码如下:

for(int i=0; i<items.size(); i++) {
items[i].values[0] = 0;
for(int j=1; j<4; j++) {
items[i].values[j] = getValue(); // returns an int
cout << items[i].values[j] << endl; // prints -1 for index 1 and 2
}
}

如果我改为将内部循环更改为以下内容,它会正常工作:

    for(int j=1; j<4; j++) {
int val = getValue(); // returns an int
items[i].values[j] = val;
cout << items[i].values[j] << endl; // prints correct value
}

我检查了 getValue 函数,它似乎工作正常。这是它的代码:

int getValue() {
items.push_back(A()); // just adds a new 'A' object to the vector
return items.size() - 1;
}

它是否与 items vector 在 push_back 调用期间被修改这一事实有关,这以某种方式使 的左侧无效items[i].values[j] = getValue(); 语句?据我所知,代码中的其他地方没有任何内存问题。

附加信息:我发布了代码的简化版本,但这基本上就是它正在做的事情。 'A' 结构内部还有一些变量需要分配。此外,这段代码在 OS X 上运行正常,但在 Linux 上运行失败。使用 gcc/++ 4.4.7。

最佳答案

Does it have something to do with the fact that the items vector is modified during the push_back call, which somehow invalidates the left-hand side of the
items[i].values[j] = getValue(); statement?

是的,确实如此。

赋值的两边没有确定的顺序,因此代码具有未定义的行为。

这些错误很难追踪,但“功能”允许进行一些低级优化。
例如,如果函数调用是内联的,则左右两侧的计算可以交错进行,从而最大限度地减少停顿。

关于c++ - 数组赋值仅适用于 C++ 中的中间变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28195557/

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