我将 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);
以避免复制/破坏,但我认为插入并没有让它变得更好。