我在这里结束了:我有一个单线程的C ++程序。这是一些经验数据和背景信息,我试图突出最重要的关键词;
std::set
打印一条消息,在终端中我可以看到。函数内的第一行也有一条调试消息,从未显示。我再也看不到任何合理的解释了。也许你可以想出如何继续下去。
编辑:重要的代码行,我更改了行号,以便我们可以引用它们并省略不相关的部分,所以并非一切似乎都是最有意义的。
a.cpp
std::cout
b.cpp
10 std::set<Array const*>* symbols;
11 std::set<Array const*> allSymbols;
12 symbols = &allSymbols;
// ... allSymbols are populated with std::inserter
15 std::cout << "eval; cd = " << &cd << ", cg = " << &cd.cg << std::endl;
16 senderConstraints = cd.cg.eval(*symbols);
输出的最后一行是:
31 template <typename ArrayContainer>
32 ConstraintList eval(ArrayContainer const request) {
33 std::cout << "inside eval ... going to update graph now" << std::endl;
然后它被困在无限循环中。
答案 0 :(得分:5)
我打赌,当你改变
时,会打印第二行ConstraintList eval(ArrayContainer const request)
到
ConstraintList eval(ArrayContainer const & request)
如果是这样,第{12}行和第15行之间allSymbols
的状态都已损坏,或者您的代码看起来更像是这样:
std::set<Array const*>* symbols;
{
std::set<Array const*> allSymbols;
symbols = &allSymbols;
// ... allSymbols are populated with std::inserter
}
std::cout << "eval; cd = " << &cd << ", cg = " << &cd.cg << std::endl;
senderConstraints = cd.cg.eval(*symbols);
这是UB,因为符号指的是已经被破坏的对象。