1

Tag クラスのデストラクタが呼び出されている理由を理解しようとしています。

map<string, Tag>* TestLoader::loadCompoundTag()
{
    map<string, Tag>* compound = new map<string, Tag>();
    //Create locally scoped variable
    Tag tag;
    string tagName;
    do 
    {
        loadTag(tag, tagName);
            //Copies variable into map
        compound->insert(std::pair<string, Tag>(tagName, tag));
    //Tag destructor is called before debugger breaks on this line
    } while (tag.type != TAG_End);

    return compound;
}

void TestLoader::loadTag( Tag& tag, string& name )
{
    tag.i = 0;
    name = string("Test");
}

デストラクタがそこで呼び出されている理由について、誰かにアイデアを教えてもらえますか? ループのスコープ内で定義されている変数はありません。1 つはループの外で作成され、もう 1 つは関数内で作成されます。ありがとう!

4

2 に答える 2

2

Tag tagリターン時にスコープ外にloadCompoundTag()なり、それが発生すると、そのデストラクタが呼び出されます。

于 2012-09-22T02:14:03.973 に答える
2

一時的に作成しているマップに挿入するには、

std::pair<string, Tag>(tagName, tag)

完全式の最後で破棄されます。

あなたはそれについて心配するべきではありません。必要に応じて を使用して回避できますemplaceが、心配する必要はありません。むしろ、関数の結果の型について心配してください。

なぜ動的に割り当てられたマップが必要なのですか?

私はあなたがそうしないと確信しています。つまり、それは時期尚早の最適化です。

したがって、正確性に焦点を当て、コンパイラーに最適化の仕事を任せて、次のように書くことを強くお勧めします。

map<string, Tag> TestLoader::loadCompoundTag() const
{
    map<string, Tag> result;
    do 
    {
        Tag tag;
        string tagName;
        loadTag(tag, tagName);
        result->emplace( std::pair<string, Tag>( tagName, tag) );
    } while (tag.type != Tag::end);
    return result;
}

ほとんどの場合、ここで戻り値の最適化を取得するために、コンパイラに最適化を依頼する必要さえありませんresult。関数の結果。

于 2012-09-22T02:25:26.537 に答える