用指针作为键的C ++映射。内存管理

时间:2015-02-25 14:38:49

标签: c++ pointers boost stdmap

我有一个STL,就像指针作为键的地图实现一样。我注意到地图上的密钥不会被释放。因为我不能保留对所有指针的引用,所以我自己无法管理内存。我读到了一些关于智能指针的内容,提出了两个问题:

  1. 除了使用之外,还有另一种方法可以获得自动内存管理 智能指针?
  2. 当键不再存在或被地图中的另一个指针覆盖时,像Boosts Smart Pointer这样的智能指针会释放我的记忆吗?
  3. 感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如果你在没有自定义比较器的情况下使用智能指针作为std::map中的键,那么它就不起作用,因为你根本不会用一个对象替换另一个对象,因为指向一个对象的指针不等同于另一个对象。不会发生替换。如果你确实使用了比较器,那么它仍然无法自动工作,因为键是一个常量,只有在地图中替换项时才会修改值。所以我认为你有3种方法来解决你的问题(假设你使用自定义比较器):

  1. 仍然使用std::map但是当替换元素时首先删除上一个键/值对并插入新对,不要使用operator []或赋值给iterator->second
  2. 仍然使用std::map,但在value部分保留智能指针和数据,并从对象中复制密钥。
  3. 使用不同的容器,例如Boost.Multi-index。您可能不需要多个索引,但此容器允许使用对象的一部分作为键和replace方法。

答案 1 :(得分:0)

  1. 在C ++ 11中,智能指针是唯一的自动内存管理。

  2. 是的,当删除对该键的最后一次引用时,std :: shared_ptr将删除内存。

  3. 您应该使用字符串而不是动态分配的char数组。字符串是自动管理的内存。将shared_ptr与动态分配的字符数组一起使用会很方便。 shared_ptr很适合管理对象。

答案 2 :(得分:0)

据推测,键是指针指向的对象而不是指针本身。如果是这样,并且您不想出于任何原因使用智能指针,则在删除地图元素时,请删除该对象。并且在释放地图时不要忘记将它们全部删除。并且不要忘记处理复制构造函数和赋值运算符等。