从指定了std :: filesystem :: path对象的类退出时出现分段错误

时间:2019-06-28 23:39:41

标签: c++ std-filesystem

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

使用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语句。因此,当它从循环中出现并中断并选择退出时,我将收到段错误。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

已修复

因此,在@ user4581301告诉我这是GCC错误之后,我重新进行了研究,发现它确实是GCC 8.3.0错误。它在GCC 9或GCC 8.3.0-7ubuntu中已修复(尽管是实验性的)。因此,现在的“修补程序”是在源文件之后添加-lstdc++fs,并且不会显示任何错误。程序按预期工作!