首页 > 解决方案 > 从指定了 std::filesystem::path 对象的类退出时出现分段错误

问题描述

我在我的程序中遇到了一个我无法克服的问题。我有一个类,我在其中声明了一个属性,例如std::filesystem::path p {"path/to/save/dir"};. 我在同一个类中有一个将一些数据保存到 .txt 文件的方法。首先,我检查一些事情,例如用户是否提供了扩展名,然后是否存在同名文件。因此,如果用户不想覆盖它,我会要求他提供一个新的名称文件。然后我写入文件。所以,问题是,每当程序退出类时,seg fault 就会弹出,特别是 save 方法如果它进入 if 子句,那么它将不会保存,因为它会收到 seg fault。我认为它与类的析构函数和调用路径对象的析构函数有关。

使用 gdb,我得到了这个消息:

0x0000555555558907 in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x20, 
    __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567
567     std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,

到目前为止我尝试过的事情:

*:

case 1: {
        Game g1(true);

        while(g1.play()){}

        break;
      }

本质上,这是 main.cpp 的一部分。它有一个菜单,后跟一个类似于用户选择的 switch 语句。因此,当它从循环中存在并中断并且我选择退出时,我会收到段错误。

任何帮助都是appriciated,谢谢。

标签: c++std-filesystem

解决方案


固定的

因此,在@user4581301 告诉我这是一个 GCC 错误之后,我以不同的方式重新研究它,发现它确实是一个 GCC 8.3.0 错误。它在 GCC 9 或 GCC 8.3.0-7ubuntu 中得到修复(虽然是实验性的)。所以现在的“修补程序”是-lstdc++fs在源文件之后添加,不会显示错误。程序按预期工作!


推荐阅读