Переменные 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
}
Другие вопросы по тегам