我有一个奇怪的问题,如果我使用中间变量,数组赋值才有效。这是程序的设置:
struct A {
int values[4];
};
std::vector<A> items;
items
向量位于一个类中,在其头文件中定义。在类构造期间,向量用'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
调用期间修改push_back
向量这一事实有关,这会以某种方式使items[i].values[j] = getValue();
语句的左侧无效?据我所知,代码中的其他地方没有任何内存问题。
其他信息: 我发布了一个淡化版本的代码,但这基本上就是它正在做的事情。 'A'结构中有一些变量被分配。此外,此代码在OS X上正确运行,但在Linux上失败。使用gcc / ++ 4.4.7。
答案 0 :(得分:1)
是否与项目向量的事实有关 在push_back调用期间修改,以某种方式使 左手边的
items[i].values[j] = getValue();
声明?
是的,确实如此。
作业的各个部分未经确定排序,因此代码具有未定义的行为。
这些是非常难以追踪的错误,但&#34;功能&#34;允许一些低级优化 例如,如果函数调用是内联的,则左侧和右侧的计算可以交错,从而最大限度地减少停顿。