[英]cout statement change program semantics
我有以下一段代码,它属于类的一部分,希望它们的详细信息对于回答该问题并不重要。 我不希望确切地解决我的问题,而只是要解释一下,我将要描述的行为是如何发生的。
Character operator+(Character c) {
std::vector<float> resDensity(density);
float l;
float dh;
for (int i = 0; i < domains.size(); i++) {
for (int j = 0; j < c.domains.size(); j++) {
l = (domains[i].intersection(c.domains[j])).length();
//std::cout << l;
dh = c.density[j] * l / domains[i].length();
resDensity[i] += dh;
}
}
std::vector<Domain> h(domains);
return Character(h, resDensity);
}
您可能已经注意到了注释的cout
语句。 由于我的程序中存在数字错误,我遵循了假值,直到我检测到变量l
。 因此,我将其打印到控制台上,发现它的值恰好是我需要的值,并且该程序也可以正常运行,并且该错误也消失了。 再次取消注释会导致意外的不良行为。
Character
类包含domains
和density
字段,两个vector
都是...
length
和intersection
方法:
float length() {
float res;
for (int i = 0; i < is.size(); i++) {
res += is[i].b - is[i].a;
}
return res;
}
Domain intersection(Domain d) {
std::vector<Interval> hi;
for (auto i = is.begin(); i != is.end(); i++) {
for (auto j = d.is.begin(); j != d.is.end(); j++) {
hi.push_back(i->intersection(*j));
}
}
Domain hhh(hi);
return hhh;
}
我用g++ --std=c++11 ...
编译代码g++ --std=c++11 ...
g++ --version
g++ (GCC) 4.8.2 20131219 (prerelease)
在你的length()
函数中, res
变量是未初始化的:
float res;
for (int i = 0; i < is.size(); i++) {
res += is[i].b - is[i].a; // <-- uses an uninitialized res
}
如何在Domain
计算length()
? hhh
是您要返回的局部变量,因此将进行复制。 如果length()
依赖于未复制的内容,那么您将看到奇怪的行为。 如果你只是改变intersection()
来返回一个浮点数或者创建一个名为intersectionLength()
的不同方法来返回一个浮点数 - 你还能得到heisenbug吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.