0

我有以下代码片段(它基本上递归地发现给定的文件夹),我不了解 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 中,但在此调用后它们将被删除。但是,由于某种原因,我稍后可以访问它们。我认为这是因为child的复制构造函数在将其插入fileSysEntries映射时被调用,但 insert 函数具有以下签名:

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

其中value是按名称参数调用,所以我猜项不会被复制,这让我有点困惑。有人可以告诉我我想念什么吗?

4

3 回答 3

3

该值QMap通过引用传递给(此处没有副本),然后在地图中复制。

于 2014-01-22T13:30:33.567 回答
2

有两个副本正在执行:

  • for(QFileInfo child : root.entryInfoList())- 将从列表中创建每个对象的副本。
  • fileSysEntries.insert(child.absoluteFilePath(), child);- 插入 QMap 时也会创建一个副本。
于 2014-01-22T13:38:09.033 回答
1

好吧,insert(or 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
}
于 2014-01-22T13:39:59.047 回答