STL映射插入拷贝构造函数

时间:2013-04-11 12:23:16

标签: c++ map stl

我在STL Map中将MyClass类型的对象存储为成对<std::string, MyClass>。 std :: string是每个MyClass对象的唯一名称。我希望每个MyClass对象只在每个名称实例化一次ONCE,因此在我的应用程序中最后只销毁一次。所以我尽量避免调用复制构造函数或默认构造函数,因为它们可能会调用destroy。 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;
}

创建和插入以这种方式工作。但是Class MyClass的析构函数叫做3!倍。甚至return item;语句也会调用析构函数,因为这是一个指针?!我认为这是不可能的,必须由delete item逼迫?!

我认为另一种方法是在地图中存储指针MyClass *而不是对象。还是有更好的选择吗?我没有使用myMap[name] = MyClass(name);来避免复制/破坏,但我认为插入不会让它变得更好。

1 个答案:

答案 0 :(得分:1)

你需要设置和分段构造插入的元素:

item = &(this->myMap.emplace(std::piecewise_construct,
                             std::forward_as_tuple(name),
                             std::forward_as_tuple(name)).first->second);