繁体   English   中英

C ++-在向量中使用std :: filesystem :: path时双重释放

[英]c++ - double free when using std::filesystem::path in a vector

我正在使用DearImgui在准文件浏览器上工作 为此,我使用带有g ++-9的std :: filesystem,目前正在Kubuntu 19.04上进行测试。 在大多数情况下,程序可以按预期运行。 使用一个按钮可以下降到父目录,然后双击可以打开一个子目录。 大多数时候,我可以无问题地浏览整个文件系统,但是某些命令组合会导致程序中止。 确切的错误消息有所不同,但始终与双重释放错误有关。

在将std :: filesystem添加到我的应用程序之前,我使用的是g ++-8(Ubuntu 8.3.0-6ubuntu1)。 但是,该程序在调用与文件系统相关的某些内容后仍然存在段错误。 这似乎是一个已知问题,应使用8.3.0-7修复(源) 同时,我决定使用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引起的,但我对此表示怀疑。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM