1

我在我的程序中遇到了一个我无法克服的问题。我有一个类,我在其中声明了一个属性,例如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,

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

  • 我已经尝试显式调用std::filesystem::path 析构函数(我的类现在没有指定析构函数方法)。不工作。
  • 我尝试将路径对象移到类之外,将其“转换”为全局对象。现在,只有当我退出声明类对象 ***** 的 main.cpp 文件时,才会出现此问题。但不是在我退出课堂的时候。
  • 我试图用 clear 方法清除路径,但由于某种我不明白的原因,它不会被调用。所以它什么也没做。

*:

case 1: {
        Game g1(true);

        while(g1.play()){}

        break;
      }

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

任何帮助都是appriciated,谢谢。

4

1 回答 1

1

固定的

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

于 2019-06-29T12:30:41.823 回答