在 C++ 自定义树的一些迭代后崩溃
Posted
技术标签:
【中文标题】在 C++ 自定义树的一些迭代后崩溃【英文标题】:crash after some iteration of a c++ custom tree 【发布时间】:2018-10-15 20:04:52 【问题描述】:我正在编写一个简单的滑动瓷砖 (3x3) 求解器。 这肯定不是最好的方法,我只是生成所有可能的配置,但我不知道为什么在执行过程中我的电脑死机,我必须手动重启。 这是主循环
while(!(tree->s==final))
//copy it in tree
expand_node(tree);
//check if in open then add if not
it++;
print_s(tree->s);
PS:我用
编译了所有内容g++ -Wall -Wextra -std=c++11 main.cpp
【问题讨论】:
请在您的问题正文中包含相关代码。这些链接会腐烂,对于任何来到它的用户来说,这个问题在未来都没有意义。此外,pastebin 广告非常庞大且不必要地分散注意力。 提供minimal reproducible example。 ~400 LOC 链接到 pastebin 绝对不是 minimal reproducible example。 【参考方案1】:在您要添加到列表中的基于 for 循环的范围内:
for(auto v : open)
if(!(v.s==tree->childs[i].s))
open.push_back(tree->childs[i]);
这将导致列表增长并触发另一次迭代,直到您机器上的所有内存都用完为止。当您的操作系统将内存交换到磁盘时,您的机器可能不会死机,只是变得非常慢。
【讨论】:
我的想法是生成所有可能的配置,直到找到解决方案。这种方法不正确吗?有什么更好的方法? @dario 没有minimal reproducible example 很难告诉你必须自己调试代码,但在我看来它可能会以无限循环结束 这个问题说在迭代时添加要打开的项目是未定义的行为:***.com/questions/35468207/… @drescherjm 仅适用于矢量,行为由std::list
定义,尽管它会根据您使用的 c++ 标准 en.cppreference.com/w/cpp/language/range-for 而变化。 c++17 将修复无限循环以上是关于在 C++ 自定义树的一些迭代后崩溃的主要内容,如果未能解决你的问题,请参考以下文章