C++ 和 Qt : is this a memory leak?(和一般问题)

标签 c++ qt memory-leaks raii

在过去的 2 年里,我主要使用 C 进行编程(之前使用了一些 Java),并决定学习 C++,使用 Qt Creator 和 Qt 库。

我的问题是下面的代码是否引入了内存泄漏:

    // filename is a QStringListIterator
    // dir is a QDir
    while (filename.hasNext()) {
            QString came_from_file(dir.filePath(filename.next()));
            QFile file(came_from_file);
            file.open(QFile::ReadOnly);
            file.readLine();
            while (!file.atEnd()) {
                    QString line(file.readLine());
                    do_something_with_stuff(line, came_from_file);
            }
    }

具体来说,我不确定生成的 dir.filePath(filename.next()) QString 会发生什么。它是引用到 came_from_file 中还是在复制后它的指针丢失了?它是“复制的”吗(我假设它永远不会,直到改变,由于 Qt 容器的 Copy-On-Write 特性)?我应该用不同的方式写这个吗,比如 QString match = dir.file...?据我了解,这应该是相等的。

它还在 Qt 文档中说 QFile 将在必要时在析构函数中关闭()文件。析构函数会被调用吗?变量确实“超出范围”,但我仍然不确定这是否属于所谓的 RAII。

如何让 file 指向不同的文件?

如果我将这样的变量传递给函数(我假设这是通过引用,因为函数 do_something... 是这样定义的),然后它们超出范围,但被插入通过函数进入QHash/QMap/QSet,会发生什么?它们是否被移除并且容器变得疯狂,或者是否有一些像 ref. 这样的奇特的小方案。这一切都算在背后?还是只是简单地复制值?

我意识到之前有人问过类似的问题,但我似乎无法通过阅读他们在这个例子中弄明白,因为它们似乎是不同的情况。

如果代码或我的理解有问题,请指正。 :)

谢谢, 南蒂尔

最佳答案

Specifically, I'm not sure what happens to the generated dir.filePath(filename.next()) QString.

came_from_fileRVO 返回值的拷贝(除非 QDir::filePath 开始) ,这又是一个自动清理的临时对象。无需将其分配给变量。

Does the destructor get called? The variable does go "out of scope"

当一个对象超出范围时,它的析构函数将被调用,除非你使用不安全的结构,如 longjmp .

How would I make file point to a different file?

我在 QFile 的 Qt 文档中找不到一个干净的方法来执行此操作.我建议您只为另一个文件声明一个新的 QFile。这样做并保持对打开文件数量的控制的一种可能性是使用范围:

{
    QFile file(some_path);
    // do stuff to file
}   // end of file's scope, so it will be closed

{
    QFile file(other_path);
}   // again, end of scope

OTOH,您可能想要显式关闭 QFile,以便您可以在刷新/关闭后检查其状态。

关于C++ 和 Qt : is this a memory leak?(和一般问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375874/

相关文章:

c++ - AST 的访问者模式

c++ - 在执行 block 之前和之后执行一些指令

c++ - 将 char[ ][ ] 的地址复制到 C 字符串

c++ - QWebView内存使用

关于 linux 内存问题的 C++ 多线程程序

.net - 易碎队列和完成队列

c++ - 实现多类型算术运算符时如何解决 "template argument deduction/substitution failure"

c++ - Qt中如何使用QSerialDevice?

c++ - 根据谓词替换 QString 中的元素

python - 如何控制QTableView上的排序箭头指示器