c++ - 从指定了 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,
到目前为止我尝试过的事情:
- 我已经尝试显式调用
std::filesystem::path
析构函数(我的类现在没有指定析构函数方法)。不工作。 - 我尝试将路径对象移到类之外,将其“转换”为全局对象。现在,只有当我退出声明类对象 ***** 的 main.cpp 文件时,才会出现此问题。但不是在我退出课堂的时候。
- 我试图用 clear 方法清除路径,但由于某种我不明白的原因,它不会被调用。所以它什么也没做。
*:
case 1: {
Game g1(true);
while(g1.play()){}
break;
}
本质上,这是 main.cpp 的一部分。它有一个菜单,后跟一个类似于用户选择的 switch 语句。因此,当它从循环中存在并中断并且我选择退出时,我会收到段错误。
任何帮助都是appriciated,谢谢。
解决方案
固定的
因此,在@user4581301 告诉我这是一个 GCC 错误之后,我以不同的方式重新研究它,发现它确实是一个 GCC 8.3.0 错误。它在 GCC 9 或 GCC 8.3.0-7ubuntu 中得到修复(虽然是实验性的)。所以现在的“修补程序”是-lstdc++fs
在源文件之后添加,不会显示错误。程序按预期工作!
推荐阅读
- audio-streaming - navigator.mediaDevices.enumerateDevices() 没有获得多个音频输出
- jquery - 日期格式化 Moment.js 并显示 Json 文件中的特定数据
- java - call.enqueue(新回调
() 在 Retrofit2 客户端中不起作用 - javascript - 在另一个功能组件中声明 React.memo 是否提供了预期的记忆性能?
- java - Mockito 3.6:在 @Before 或 @BeforeClass 中使用 mockStatic 和 JUnit4
- python - __str__ 在下面的代码中做了什么?列出的两个代码是不同的
- android - FCM 推送通知在设备休眠时重新唤醒应用程序无效
- laravel - Laravel中的动态轮播不显示正确的数据
- python-3.x - 读取文本文件的每一行,删除特定字符串之前的所有字符,然后在 Python 中另存为新文件
- angular - 如何为类属性赋值?