我在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);
来避免复制/破坏,但我认为插入不会让它变得更好。
答案 0 :(得分:1)
你需要设置和分段构造插入的元素:
item = &(this->myMap.emplace(std::piecewise_construct,
std::forward_as_tuple(name),
std::forward_as_tuple(name)).first->second);