Переменные C++ не удаляются в конце области
У меня есть следующий фрагмент кода (который в основном обнаруживает заданную папку рекурсивно), и я не понимаю что-то об управлении памятью в C++:
for(QFileInfo child : root.entryInfoList()) {
if (child.isDir() &&
child.absoluteFilePath() != rootInfo.absoluteFilePath() &&
child.absoluteFilePath() != rootInfo.absolutePath())
{
discoverDirectory(child.absoluteFilePath());
} else if (child.isFile()) {
qDebug() << "Visiting file: " + child.absoluteFilePath();
watchDog->addPath(child.absoluteFilePath());
fileSysEntries.insert(child.absoluteFilePath(), child);
}
}
Насколько я помню, переменные, созданные без new, удаляются в конце области, поэтому все, что находится в entryInfoList, будет уничтожено в конце этой функции. Поэтому я подумал, что это не должно работать, так как я хочу сохранить дочерние элементы в файле fileSysEntries QMap, но они будут удалены после этого вызова. Тем не менее, я могу получить к ним доступ по некоторым причинам. Я думал, что это потому, что дочерний конструктор копирования вызывается при вставке его в карту fileSysEntries, но функция вставки имеет следующую подпись:
iterator QMap::insert(const Key & key, const T & value)
где значение является параметром вызова по имени, поэтому, я думаю, дочерние элементы не копируются, что немного смущает меня. Может ли кто-нибудь показать мне, что я скучаю?
3 ответа
Значение передается в QMap
по ссылке (здесь нет копии), а затем копируется внутри карты.
Выполняется две копии:
for(QFileInfo child : root.entryInfoList())
- создаст копию каждого объекта из списка.fileSysEntries.insert(child.absoluteFilePath(), child);
- также создаст копию при вставке в QMap.
Ну, факт insert
(или же insertMulti
) функция принимает значение, которое будет вставлено по ссылке, не мешает ей впоследствии сделать копию.
И когда вы смотрите на исходный код Qt (qmap.h
), это на самом деле то, что происходит:
template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator
QMap<Key, T>::insert(const Key &akey, const T &avalue)
{
//Stuff
last->value = avalue;//Here, a copy is made through copy assignement
//Stuff
}