我有一个STL,就像指针作为键的地图实现一样。我注意到地图上的密钥不会被释放。因为我不能保留对所有指针的引用,所以我自己无法管理内存。我读到了一些关于智能指针的内容,提出了两个问题:
感谢您的帮助。
答案 0 :(得分:2)
如果你在没有自定义比较器的情况下使用智能指针作为std::map
中的键,那么它就不起作用,因为你根本不会用一个对象替换另一个对象,因为指向一个对象的指针不等同于另一个对象。不会发生替换。如果你确实使用了比较器,那么它仍然无法自动工作,因为键是一个常量,只有在地图中替换项时才会修改值。所以我认为你有3种方法来解决你的问题(假设你使用自定义比较器):
std::map
但是当替换元素时首先删除上一个键/值对并插入新对,不要使用operator []或赋值给iterator->second
std::map
,但在value
部分保留智能指针和数据,并从对象中复制密钥。replace
方法。答案 1 :(得分:0)
在C ++ 11中,智能指针是唯一的自动内存管理。
是的,当删除对该键的最后一次引用时,std :: shared_ptr将删除内存。
您应该使用字符串而不是动态分配的char数组。字符串是自动管理的内存。将shared_ptr与动态分配的字符数组一起使用会很方便。 shared_ptr很适合管理对象。
答案 2 :(得分:0)
据推测,键是指针指向的对象而不是指针本身。如果是这样,并且您不想出于任何原因使用智能指针,则在删除地图元素时,请删除该对象。并且在释放地图时不要忘记将它们全部删除。并且不要忘记处理复制构造函数和赋值运算符等。