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に保存したいので、これはうまくいかないと思いましたが、この呼び出しの後に削除されます。ただし、何らかの理由で後でアクセスできます。これは、 fileSysEntriesマップに挿入するときにchildのコピー コンストラクターが呼び出されるためだと思いましたが、insert 関数には次のシグネチャがあります。

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

ここで、は名前パラメーターによる呼び出しであるため、アイテムはコピーされません。これは私を少し混乱させます。誰かが私が見逃しているものを見せてもらえますか?

4

3 に答える 3

3

値は参照によって に渡されQMap(ここではコピーしません)、その後マップ内にコピーされます。

于 2014-01-22T13:30:33.567 に答える
2

2 つのコピーが実行されています。

  • for(QFileInfo child : root.entryInfoList())- リストからすべてのオブジェクトのコピーを作成します。
  • fileSysEntries.insert(child.absoluteFilePath(), child);- QMap に挿入するときにもコピーを作成します。
于 2014-01-22T13:38:09.033 に答える