2014-01-22 2 views
0

У меня есть следующий фрагмент коды (который в основном discoveres данной папки рекурсивно), и я не понимаю, что-то об управлении памятью в 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); 
    } 
} 

Как я помню, переменные, созданные без новых, удаляются в конце области, поэтому все, что находится в entryInfoList, будет удалено в конце этой функции. Поэтому я думал, что это не должно работать, так как я хочу сохранить детей элементов в файле fileSysEntries QMap, но они будут удалены после этого вызова. Однако по какой-то причине я могу получить к ним доступ позже. Я думал, что это происходит потому, что ребенок «s конструктор копирования вызывается при вставке его в fileSysEntries карты, но функция вставки имеет следующую подпись:

iterator QMap::insert(const Key & key, const T & value) 

где значение является вызовом параметр имени , так что ребенок предметы не копируются. Я думаю, что меня немного смущает. Может ли кто-нибудь показать мне, что я пропустил?

ответ

3

Значение передается в QMap по ссылке (здесь нет копии) и впоследствии копировано внутри карты.

+0

А я вижу, что я не знаю, что теперь это имеет смысл, спасибо. – Peter

+0

Передача по ссылке означает, что функции присваивается исходный объект, а не копия. Это не означает, что функция не будет делать собственную копию внутри. – benjymous

2

Есть два экземпляра выполняется:

  • for(QFileInfo child : root.entryInfoList()) - создаст копию каждого объекта ация список.
  • fileSysEntries.insert(child.absoluteFilePath(), child); - также создаст копию при вставке в QMap.
1

Ну, то функция 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 
} 
Смежные вопросы