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

标签 c++ pointers boost stdmap

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

  1. 除了使用之外,还有其他方法可以实现自动内存管理吗? 智能指针?
  2. 当键不再存在或被映射中的另一个指针覆盖时,像 Boosts Smart Pointer 这样的智能指针是否会释放我的内存?

感谢您的帮助。

最佳答案

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

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

关于以指针为键的 C++ 映射。内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721802/

相关文章:

c - 我们如何将整个段落作为二维数组中的输入作为单独的行?

c++ - 高效的数据包类型/传输协议(protocol)

c++ - 使用视觉样式设置 WinAPI 工具栏的背景色?

c++ - 家长访问 child 私有(private)/ protected

c++ - 是否可以将异常传递给处理程序然后重新抛出原始异常?

c - 函数名中的指针/指针函数

c++ - 将其转换为共享指针并将其作为参数传递给另一个 C++ 类

linux - 在 Linux 中安装 Boost

c++ - Travis CI 上 Boost 中对 `std::__cxx11::basic_string 的 undefined reference

c++ - Windows 找不到 win_bison.exe