以指针为键的 C++ 映射。内存管理
C++ map with pointer as key. Memory management
我有一个类似于 STL 的地图实现,其中指针作为键。正如我注意到的那样,钥匙不会被地图释放。因为我无法保留对所有指针的引用,所以我无法自己管理内存。我读了一些关于智能指针的文章,提出了两个问题:
- 除了使用之外,还有其他方法可以实现自动内存管理吗?
智能指针?
- 当密钥不再存在或被映射中的另一个指针覆盖时,像 Boosts Smart Pointer 这样的智能指针会释放我的内存吗?
感谢您的帮助。
在C++11中智能指针是唯一的自动内存管理。
是的,std::shared_ptr会在删除最后一次对键的引用时删除内存。
您应该使用字符串而不是动态分配的字符数组。字符串是自动管理的内存。将 shared_ptr 与动态分配的字符数组一起使用并不方便。 A shared_ptr 好管理对象。
大概键是指针指向的对象中的某些东西,而不是指针本身。如果是这样,并且您出于某种原因不想使用智能指针,那么当您擦除地图元素时,请删除该对象。并且不要忘记在释放地图时将它们全部删除。并且不要忘记处理复制构造函数和赋值运算符等
如果在没有自定义比较器的情况下使用智能指针作为 std::map
中的键,则它不起作用,因为您根本不会用一个对象替换另一个对象,因为指向一个对象的指针不等同于另一个和替换不会发生。如果您确实使用比较器,那么它仍然不会自动工作,因为键是一个常量,并且只有在您替换地图中的项目时才会修改值。所以我认为你有 3 种方法来解决你的问题(假设你使用自定义比较器):
- 仍然使用
std::map
,但是当替换元素时,先移除先前的 key/value 对并插入新的对,不要使用运算符 [] 或赋值给 iterator->second
- 仍然使用
std::map
,但将智能指针和数据保留在 value
部分并从您的对象复制密钥。
- 使用不同的容器,例如 Boost.Multi-index。您可能不需要多个索引,但此容器允许使用对象的一部分作为键和
replace
方法。
我有一个类似于 STL 的地图实现,其中指针作为键。正如我注意到的那样,钥匙不会被地图释放。因为我无法保留对所有指针的引用,所以我无法自己管理内存。我读了一些关于智能指针的文章,提出了两个问题:
- 除了使用之外,还有其他方法可以实现自动内存管理吗? 智能指针?
- 当密钥不再存在或被映射中的另一个指针覆盖时,像 Boosts Smart Pointer 这样的智能指针会释放我的内存吗?
感谢您的帮助。
在C++11中智能指针是唯一的自动内存管理。
是的,std::shared_ptr会在删除最后一次对键的引用时删除内存。
您应该使用字符串而不是动态分配的字符数组。字符串是自动管理的内存。将 shared_ptr 与动态分配的字符数组一起使用并不方便。 A shared_ptr 好管理对象。
大概键是指针指向的对象中的某些东西,而不是指针本身。如果是这样,并且您出于某种原因不想使用智能指针,那么当您擦除地图元素时,请删除该对象。并且不要忘记在释放地图时将它们全部删除。并且不要忘记处理复制构造函数和赋值运算符等
如果在没有自定义比较器的情况下使用智能指针作为 std::map
中的键,则它不起作用,因为您根本不会用一个对象替换另一个对象,因为指向一个对象的指针不等同于另一个和替换不会发生。如果您确实使用比较器,那么它仍然不会自动工作,因为键是一个常量,并且只有在您替换地图中的项目时才会修改值。所以我认为你有 3 种方法来解决你的问题(假设你使用自定义比较器):
- 仍然使用
std::map
,但是当替换元素时,先移除先前的 key/value 对并插入新的对,不要使用运算符 [] 或赋值给iterator->second
- 仍然使用
std::map
,但将智能指针和数据保留在value
部分并从您的对象复制密钥。 - 使用不同的容器,例如 Boost.Multi-index。您可能不需要多个索引,但此容器允许使用对象的一部分作为键和
replace
方法。