2

我正在使用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 引​​起的,但我对此表示怀疑。

4

1 回答 1

0

我找到了解决问题的方法。currentPath使用assign(...)函数而不是赋值运算符进行更新=似乎可以解决问题。

于 2019-06-27T21:51:12.927 回答