【问题标题】:crash after some iteration of a c++ custom tree在 C++ 自定义树的一些迭代后崩溃
【发布时间】: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

标签: c++ algorithm c++11 tree sliding-tile-puzzle


【解决方案1】:

在您要添加到列表中的基于 for 循环的范围内:

for(auto v : open)
    if(!(v.s==tree->childs[i].s))
        open.push_back(tree->childs[i]);

这将导致列表增长并触发另一次迭代,直到您机器上的所有内存都用完为止。当您的操作系统将内存交换到磁盘时,您的机器可能不会死机,只是变得非常慢。

【讨论】:

  • 我的想法是生成所有可能的配置,直到找到解决方案。这种方法不正确吗?有什么更好的方法?
  • @dario 没有minimal reproducible example 很难告诉你必须自己调试代码,但在我看来它可能会以无限循环结束
  • 这个问题说在迭代时添加要打开的项目是未定义的行为:stackoverflow.com/questions/35468207/…
  • @drescherjm 仅适用于矢量,行为由 std::list 定义,尽管它会根据您使用的 c++ 标准 en.cppreference.com/w/cpp/language/range-for 而变化。 c++17 将修复无限循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多