在我正在编写的程序中,如果我在开头有一个cout << endl
语句,那么某段代码只能正常工作。如果它不存在,程序不会出现段错误,但只是在100%的时间内给出了一个可验证的错误答案。使用cout << endl
语句,它每次都有效。我实际上不知道是什么导致这个,因为我已经尝试使用cout.flush()
刷新cout缓冲区,但它没有任何效果。此外,如果没有endl,则无法使用cout
。我也进行了双重检查,Node
结构的所有成员变量都已在结构的初始化列表中初始化。如果有人能帮助我,我会非常感激!这是令人讨厌的代码:
` bool Board::CheckDistinct(Node* node, int* rec) {
cout << endl; // if I comment this line out, it doesn't work correctly
if(node->incoming.size() > 1) {
Node* rec_node = node->incoming[rand() % node->incoming.size()];
*rec = rec_node->row * num_cols() + rec_node->col;
return false;
}
else if(node->incoming.size() == 0) return true;
else {
node->visited = true;
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
}
}
以下是Node
结构的代码(如果它有帮助):
struct Node {
int val, row, col, dist;
bool visited, is_white_hole, is_black_hole;
Node* outgoing[4];
std::vector<Node*> incoming;
Node(int val_, int row_, int col_) :
val(val_), row(row_), col(col_), dist(-1),
visited(false),
is_white_hole(true), is_black_hole(true) { }
};
答案 0 :(得分:3)
我怀疑问题是你没有回复你的内心结果:
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
应该是:
if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec);
^^^^^^
cout
调用可能只是以某种方式改变代码生成(例如,编译器可能决定实际递归而不是将尾递归转换为循环,或者以某种方式使用不同的寄存器,或者一长串其他事情。
(应该注意的是,我已多次看到这个错误,并且自己做了几次......这一点并不罕见!)
答案 1 :(得分:0)
好的,我终于找到了。错误发生在return语句中:
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
如果那不是真的话,我没有会返回的else语句,所以我猜这个时候发生了未定义的行为。我仍然不知道为什么cout << endl
解决了这个问题,但我想这就是它的原因。