1

<std::string, MyClass>STL マップにペアとして格納されているタイプ MyClass のオブジェクトがあります。std::string は、各 MyClass オブジェクトの一意の名前です。すべての MyClass オブジェクトを名前ごとに 1 回だけインスタンス化し、アプリケーションで最後に 1 回だけ破棄するようにしたいと考えています。したがって、破壊を呼び出す可能性があるため、コピー コンストラクターまたはデフォルト コンストラクターの呼び出しを避けるようにしています。MyClass オブジェクトは、一度だけ割り当て/解放されるある種のリソースを参照します。このコードを使用して MyClass のインスタンスを作成し、それらをマップに配置して、作成したばかりのインスタンスへのポインターを戻そうとしました。

MyClass* FooClass::GetItem(std::string name)
{
    MyClass* item = GetItemExists(name);

    if (item == NULL)
    {
        item = &(*((this->myMap.insert(std::pair<std::string, MyClass>
                                      (name, MyClass(name)))).first)).second;       
    }

    return item;
}

作成と挿入はこのように機能します。しかし、クラス MyClass のデストラクタは 3 と呼ばれます! 回。return item;これはポインターであるため、ステートメントでさえデストラクタを呼び出しますか?! 私はこれは不可能であり、強制されなければならないと思ったdelete item?!

別の方法は、オブジェクトの代わりにポインタ MyClass* をマップに格納することだと思いました。または、より良い代替手段はありますか?コピー/破壊を避けるために使用しませんでしmyMap[name] = MyClass(name);たが、挿入しても改善されないと思います。

4

1 に答える 1

1

挿入された要素を配置して区分的に構築する必要があります。

item = &(this->myMap.emplace(std::piecewise_construct,
                             std::forward_as_tuple(name),
                             std::forward_as_tuple(name)).first->second);
于 2013-04-11T12:30:27.707 に答える