Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;这是内存泄漏吗?(和一般问题) 我过去2年中主要使用C编程(以前是java),决定学习C++,使用Qt创建者和Qt库。_C++_Qt_Memory Leaks_Raii - Fatal编程技术网

C++;这是内存泄漏吗?(和一般问题) 我过去2年中主要使用C编程(以前是java),决定学习C++,使用Qt创建者和Qt库。

C++;这是内存泄漏吗?(和一般问题) 我过去2年中主要使用C编程(以前是java),决定学习C++,使用Qt创建者和Qt库。,c++,qt,memory-leaks,raii,C++,Qt,Memory Leaks,Raii,我的问题是以下代码是否会导致内存泄漏: // 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:

我的问题是以下代码是否会导致内存泄漏:

    // 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会发生什么。它是引用到文件中的
中,还是复制后指针丢失?它是“复制”的吗(我假设它永远不会被复制,直到由于Qt容器的写时复制特性而被更改为止)?我是否应该以不同的方式编写它,比如
QString match=dir.file…
?据我理解,这应该是平等的

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

如何使
文件
指向不同的文件

如果我将这样的变量传递给函数(我假设这是通过引用传递的,因为函数
dou\u something…
是这样定义的),然后它们超出了范围,但被函数插入到QHash/QMap/QSet中,会发生什么?它们会被移走,容器会发疯吗?还是会有一些像ref.counting这样的花哨小计划?或者这些值只是复制的

我知道以前也有人问过类似的问题,但在这个例子中,我似乎无法通过阅读来理解,因为它们似乎是不同的情况

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

谢谢, 南希尔

具体来说,我不确定生成的
dir.filePath(filename.next())
QString会发生什么

come\u from\u file
是的返回值的副本(除非插入),而返回值又是自动清理的临时对象。无需将其分配给变量

析构函数被调用了吗?变量确实“超出范围”

当对象超出范围时,将调用其析构函数,除非使用不安全的构造,如

如何使
文件
指向不同的文件

我在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

另外,您可能希望显式关闭
QFile
,以便在刷新/关闭后检查其状态。

当您发布的代码离开作用域时,对象上的解构器被调用,所有内容都被清除。一般来说,在C++中,你唯一需要担心内存泄漏的时候是使用新关键字,或者返回一个系统分配对象的指针(比如Windows上的设备上下文)的函数,在这种情况下,你必须使用适当的系统清理调用。p> 对于函数,除非指定为引用或指针,否则所有参数都是按值的。引用通常用作函数参数,以防止性能受到影响而不得不将大型对象复制到函数中。大多数情况下,这些引用都是常量,以防止修改传入数据的值。C++中的引用与指针非常相似,没有指针语法混乱。p> 无效foo(b栏);//按价值

void foo(const bar&b);//按常量参考


void foo(酒吧和早餐);//by ref,一个可变的条形对象,此函数对传入的条形对象执行某些操作,操作结果将在原始条形对象上可见。

为什么临时
文件路径
对象会自动清理?它是生成然后销毁的吗?如果我在C中做这样的事情,我会被泄露。谢谢,非常有帮助。我以前从未听说过RVO,也没有想过用这种方式使用示波器。:)顺便问一下,您是否建议改为使用
FILE*
。@Nanthiel:临时语句一完成就会被销毁。与C的区别在于,在C中,您可以使用指针,但即使在C中,您也可以返回任意大的
struct
。在C++中,指针返回值通常是调用方需要进行显式清理的标志。对于<代码> qfile vs>代码>文件*/COD>,我建议在与QT代码接口时,使用代码> >文件> <代码>,当与C代码接口时,代码>文件> >代码,在所有其他情况下,使用标准C++流。我通常不考虑用C语言返回大型结构。下次编程时,我必须考虑所有的可能性,以找到最好的结构。@larsmans哦,我想我不会忘记的。我只是在写评论。:)对不起,我被新的用户界面弄糊涂了。我看的是你的答案,而不是你的问题。如果一个人需要一个由新的或系统分配的对象分配的资源,RAII可能会被用来管理资源。只是说,'.@casualcoder同意,但这是我能想出的最快的例子,即使是处理一个真实的原始指针。评论或多或少是针对OP的。