C和Qt:这是内存泄漏吗? (和一般问题)
作者:互联网
在过去的两年里,我主要使用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);
}
}
具体来说,我不确定生成的dir.filePath(filename.next())QString会发生什么.它被引入came_from_file还是复制后指针会丢失?它是否被“复制”(我认为它永远不会,直到更改,由于Qt容器的Copy-On-Write性质)?我应该用不同的方式写这个,比如QString match = dir.file …?据我了解,这应该是平等的.
它还在Qt文档中说QFile将在析构函数中关闭()必要的文件.析构函数会被调用吗?变量确实“超出范围”,但我仍然不确定这是否是所谓的RAII的情况.
我如何使文件指向不同的文件?
如果我将这样的变量传递给函数(我假设这是通过引用,因为函数do_something …以这种方式定义),然后它们超出范围,但是被函数插入到QHash / QMap / QSet中, 怎么了?他们被删除了,容器变得疯狂,还是有一些像ref那样花哨的小方案.在这一切背后算吗?或者只是简单地复制了这些值?
我之前已经意识到类似的问题,但我似乎无法通过阅读它们来解释这个问题,因为它们似乎是不同的情况.
如果代码或我的理解有问题,请纠正我.
标签:raii,c,qt,memory-leaks 来源: https://codeday.me/bug/20190726/1540851.html