Mat*_*tej 3 c++ qt memory-leaks raii
在过去的两年里,我主要使用C进行编程(以前是一些Java),并决定使用Qt Creator和Qt库来学习C++.
我的问题是以下代码是否引入了内存泄漏:
// 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);
}
}
Run Code Online (Sandbox Code Playgroud)
具体来说,我不确定生成的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那样花哨的小方案.在这一切背后算吗?或者只是简单地复制了这些值?
我之前已经意识到类似的问题,但我似乎无法通过阅读它们来解释这个问题,因为它们似乎是不同的情况.
如果代码或我的理解有问题,请纠正我.:)
谢谢,南蒂尔
具体来说,我不确定生成的
dir.filePath(filename.next())QString 会发生什么.
came_from_file返回值的副本(除非RVO启动)QDir::filePath,而后者又是一个自动清理的临时对象.无需将其分配给变量.
析构函数会被调用吗?该变量确实"超出范围"
当一个对象超出范围时,将调用它的析构函数,除非你使用不安全的结构longjmp.
我如何
file指向不同的文件?
我在Qt文档中找不到干净的方法来做到这一点QFile.我建议你只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
Run Code Online (Sandbox Code Playgroud)
OTOH,您可能希望明确关闭它,QFile以便在刷新/关闭后检查其状态.