将堆对象分配给std::map

Assigning heap objects to a std::map

本文关键字:std map 分配 对象      更新时间:2023-10-16

运行时会崩溃。

std::map<std::string, MyClass> myMap;
myValue = new MyClass();
myMap["myKey"] = *myValue;

我有两个要求:

  1. MyClass的实例保存在堆上(因此使用new);
  2. 我能够通过关联数组引用这些(因此使用std::Map)。

为什么我不能在示例中成功使用解引用操作符?我怎样才能同时做到这两点呢?

p。

您可以使用boost或tr1 shared_ptr:

std::map<std::string, shared_ptr< MyClass > > myMap;
myValue = shared_ptr< MyClass >( new MyClass() );
myMap["myKey"] = myValue;
没有所有权问题,没有内存泄漏。

如果您失去了myValue的作用域,那么它就是内存泄漏。因此,最好将MyClass*存储在您的地图中。

std::map<std::string, MyClass*> myMap;
myValue = new MyClass();
myMap["myKey"] = myValue;

在给定的示例中,还确保在从map<>擦除或删除时delete元素。如果你不想担心内存管理,你可以使用智能指针(例如boost::shared_ptr)。

也,从你给出的例子,我不知道为什么它应该崩溃,而解引用*myClass。你是否在复制构造函数MyClass::MyClass(const MyClass&)中做了一些奇怪的事情?

您的最后一行在映射中创建了一个新的MyClass实例,并对其调用赋值操作符。我假设你的对象中有一些指针,当你试图释放一些内存两次时,你会得到一个错误。

与Java不同,c++中没有隐式引用语义;如果想要存储指针,则需要使用std::map<std::string, MyClass*>并相应地处理内存管理,或者,如stijn所说,使用某种形式的shared_prt

您正在第2行创建一个新对象并将其复制到映射中。您可能正在寻找boost::ptr_map.