将堆对象分配给std :: map

时间:2011-07-21 11:18:29

标签: c++ gcc stl map

这在运行时崩溃。

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

我有2个要求:

  1. MyClass的实例保存在堆上(因此使用new);
  2. 我可以通过关联数组引用它们(因此使用std :: Map)。
  3. 为什么我不能在示例中成功使用取消引用运算符?我怎样才能同时完成这两项工作?

    PS。我正在使用gcc。

4 个答案:

答案 0 :(得分:5)

你可以使用boost或tr1 shared_ptr来代替它:

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

没有所有权问题,没有内存泄漏。

答案 1 :(得分:4)

如果你失去myValue的范围,那么就是内存泄漏。因此,最好将MyClass*存储在地图中。

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

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

另外,从您给出的示例中,我不知道为什么在解除引用*myClass时它会崩溃。你在复制构造函数MyClass::MyClass(const MyClass&)中做了一些奇怪的事吗?

答案 2 :(得分:1)

你的最后一行在地图中创建了一个MyClass的新实例,并在其上调用赋值运算符。我假设您的对象中有一些指针,并且在尝试释放一些内存两次时出现错误。

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

答案 3 :(得分:0)

您正在第2行创建一个新对象并/ /将它复制到地图中。您可能正在寻找boost :: ptr_map。