gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:06:19 35 4
gpt4 key购买 nike

在过去的 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com