首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以指针为键的C++映射。内存管理

以指针为键的C++映射。内存管理
EN

Stack Overflow用户
提问于 2015-02-25 14:38:48
回答 3查看 2.1K关注 0票数 0

我有一个STL,类似于一个以指针作为键的映射的实现。正如我注意到的那样,地图不会释放钥匙。因为我不能保存对所有指针的引用,所以我无法亲自管理内存。我读到了一些关于智能指针的文章,提出了两个问题:

  1. 除了使用智能指针之外,还有其他方法来获得自动内存管理吗?
  2. 当键不再存在或被地图中的另一个指针覆盖时,智能指针会像增强智能指针那样释放我的内存吗?

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-25 15:04:43

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

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

Stack Overflow用户

发布于 2015-02-25 14:44:30

  1. 在C++11中,智能指针是唯一的自动内存管理。
  2. 是的,当删除对键的最后引用时,std::shared_ptr将删除内存。

您应该使用字符串而不是动态分配的char数组。字符串是自动管理内存。在动态分配的字符数组中使用shared_ptr是不方便的。shared_ptr很适合管理对象。

票数 0
EN

Stack Overflow用户

发布于 2015-02-25 14:46:12

据推测,键是指针所指向的对象中的东西,而不是指针本身。如果是这样,并且您不希望出于任何原因使用智能指针,则在删除map元素时,删除该对象。当地图被释放时,别忘了把它们全部删除。不要忘记处理复制构造函数和赋值操作符等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28721802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档