我正在使用DearImgui开发一个简单的文件浏览器。为此,我将 std::filesystem 与 g++-9 一起使用,目前正在 Kubuntu 19.04 上进行测试。在大多数情况下,该程序按预期工作。一个按钮用于下降到父目录,并且可以通过双击打开子目录。大多数时候,我可以毫无问题地浏览整个文件系统,但是某些命令组合会导致程序中止。确切的错误消息各不相同,但总是与双重释放错误有关。
在将 std::filesystem 添加到我的应用程序之前,我使用的是 g++-8 (Ubuntu 8.3.0-6ubuntu1)。但是,在调用与文件系统相关的内容后,该程序继续出现段错误。这似乎是一个已知问题,应使用 8.3.0-7 (source)修复。与此同时,我决定使用 g++-9 (Ubuntu 9.1.0-2ubuntu2~19.04)。我不确定这是否是我的问题的原因。
这是导致中止的代码:
namespace fs = std::filesystem;
struct FileBrowser {
fs::path currentPath = fs::current_path();
std::vector<fs::path> files;
void UpdateFiles() {
files.clear();
for (auto& entry : fs::directory_iterator(currentPath))
files.push_back(entry.path()); // Leak_DefinitelyLost
}
void DrawContent() {
if (BackButtonPressed && currentPath.has_parent()) {
currentPath = currentPath.parent_path(); // Jump depends on uninitialised value
UpdateFiles();
}
static bool invalidate = false;
for (auto& entry : files) {
if (ClickedOnThisEntry && fs::is_directory(entry)) {
currentPath = entry; // InvalidRead
invalidate = true;
}
}
if (invalidate) {
UpdateFiles();
invalidate = true;
}
}
};
当使用 Valgrind 运行程序时,它会在更新路径向量和未初始化条件时报告泄漏。尝试将所选路径复制到当前路径时,主要错误似乎是无效读取。
一个可重现的示例需要 SDL2 和 imgui。如果有人感兴趣,我可以发一个。
有趣的是,当我在 gdb 中运行程序并触发中止时,我无法再使用鼠标单击任何内容(甚至是不相关的应用程序,例如 firefox)。我仍然可以使用键盘并通过命令行杀死 gdb。在这个项目中以前没有发生过类似的事情,我无法在程序的无关部分中重现它。这可能是由 Imgui 引起的,但我对此表示怀疑。