在 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++ 自定义树的一些迭代后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OOPC++自定义类型的迭代器

在 C++ 中为我自己的自定义向量模板类实现迭代器(类似于 STL)[重复]

Qt Designer 使用自定义插件崩溃

在自定义控件中创建子按钮窗口后崩溃

在OpenGL 4.5中迭代自定义结构unifrom数组

切换到 XCode 7.0(.1) 后,自定义视图 (XIB) 在发布模式下崩溃