系统相关
首页 > 系统相关> > C和Qt:这是内存泄漏吗? (和一般问题)

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