2014-01-22 21 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中,但它们将在此调用后删除。但是,由于某种原因,我可以稍后访问它们。我想这是因为将其插入fileSysEntries当孩子的拷贝构造函数被调用地图,插入功能具有以下特征:

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

其中是名称参数调用,所以孩子项目不会被复制我猜,这使我有点混淆。有人能告诉我我错过了什么吗?

回答

3

该值通过参考传递给QMap(此处不作复制)和之后复制到地图中。

+0

我明白了,我不知道,现在这是有道理的,谢谢。 – Peter

+0

通过引用传递仅仅意味着该函数被赋予了原始对象,而不是副本。这并不意味着该功能不会在内部制作自己的副本。 – benjymous

2

有正在执行两个副本:

  • for(QFileInfo child : root.entryInfoList()) - 将创建的每一个对象f光盘的副本列表。
  • 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 
}