Я в основном использовал C для программирования в последние 2 года (ранее немного 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)? Должен ли я написать это по-другому, как QString match = dir.file...
? Насколько я понимаю, это должно быть равно.
В документах Qt также говорится, что QFile собирается закрыть () файл, если необходимо, в деструкторе. Деструктор вызывается? Переменная действительно выходит из области видимости, но я все еще не уверен, имеет ли это место так называемый RAII.
Как бы я мог file
указать на другой файл?
Если я передаю переменные, подобные этой, в функции (я предполагаю, что это по ссылке, так как функция do_something...
определяется таким образом), а затем они выходят из области видимости, но включаются в QHash / QMap / QSet функция, что происходит? Удаляются ли они и контейнеры сходят с ума, или есть какая-то причудливая маленькая схема, такая как реф. считая за всем этим? Или значения просто скопированы?
Я понимаю, что подобные вопросы задавались ранее, но я не могу понять это в этом примере, прочитав их, поскольку они кажутся разными.
Если с кодом или моим пониманием что-то не так, поправьте меня. :)
Спасибо,
Nanthiel