1

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