21人参与 • 2025-08-19 • C/C++
使用 clear()
可以删除 map
中的所有元素,销毁每个元素:
#include <iostream> #include <map> int main() { std::map<int, std::string> mymap; mymap[1] = "one"; mymap[2] = "two"; std::cout << "before clear, size: " << mymap.size() << std::endl; // 清空 map mymap.clear(); std::cout << "after clear, size: " << mymap.size() << std::endl; return 0; }
输出:
before clear, size: 2
after clear, size: 0
注意:clear()
只是删除节点,不一定释放底层内存池分配的所有内存(stl 可能保留内存用于以后复用)。
为了让 stl 容器释放所有内存,可以和一个空 map 交换:
std::map<int, std::string>().swap(mymap);
等价于:
std::map<int, std::string> emptymap; mymap.swap(emptymap); // 将 mymap 与空 map 交换
如果 map
中是指针类型,需要先释放指针指向的内存,否则会泄漏:
#include <map> #include <string> #include <iostream> int main() { std::map<int, std::string*> mymap; mymap[1] = new std::string("one"); mymap[2] = new std::string("two"); // 手动释放指针 for (auto& pair : mymap) { delete pair.second; } mymap.clear(); // 删除节点 // 或者彻底释放内存 std::map<int, std::string*>().swap(mymap); std::cout << "map cleared and memory released" << std::endl; }
操作 | 内存释放效果 | 适用场景 |
---|---|---|
mymap.clear() | 删除元素,可能不释放底层节点内存 | 小型 map 或可重复使用的 map |
std::map<…>().swap(mymap) | 删除元素,释放底层内存 | 大型 map,彻底释放内存 |
对指针类型元素手动 delete | 释放指针对象占用内存 | map 存储动态分配对象 |
下面是一个 模板化函数 free_map_memory
,能自动处理 指针和非指针类型 map 的完全释放,被封装成可复用工具函数,可以直接应用到开发项目中,大家可根据自己的需求进行更改。
#include <map> #include <type_traits> #include <memory> // std::addressof #include <utility> // std::swap #include <iostream> template <typename maptype> void free_map_memory(maptype& m) { using valuetype = typename maptype::mapped_type; // 如果 valuetype 是指针类型,先 delete 指针 if constexpr (std::is_pointer_v<valuetype>) { for (auto& kv : m) { delete kv.second; } } // 清空 map 元素 m.clear(); // 彻底释放底层内存 maptype().swap(m); } // ------------------- 示例 ------------------- struct mydata { int x; mydata(int v) : x(v) {} }; int main() { std::map<int, int> normalmap; normalmap[1] = 100; normalmap[2] = 200; std::map<int, mydata*> pointermap; pointermap[1] = new mydata(10); pointermap[2] = new mydata(20); std::cout << "before free, normalmap size: " << normalmap.size() << std::endl; std::cout << "before free, pointermap size: " << pointermap.size() << std::endl; free_map_memory(normalmap); free_map_memory(pointermap); std::cout << "after free, normalmap size: " << normalmap.size() << std::endl; std::cout << "after free, pointermap size: " << pointermap.size() << std::endl; return 0; }
功能特点
std::is_pointer_v
。delete
。swap
与临时空 map 交换。std::map<key, value>
类型,包括自定义结构体指针。加强版本能自动识别并处理以下几类 map
:
std::unique_ptr
或 std::shared_ptr
模板函数会自动释放内容并彻底回收 map 内存。
#include <map> #include <memory> #include <type_traits> #include <utility> #include <iostream> template <typename maptype> void free_map_memory(maptype& m) { using valuetype = typename maptype::mapped_type; // 原始指针类型 if constexpr (std::is_pointer_v<valuetype>) { for (auto& kv : m) { delete kv.second; } } // unique_ptr 或 shared_ptr 类型 else if constexpr (std::is_same_v<valuetype, std::unique_ptr<typename valuetype::element_type>> || std::is_same_v<valuetype, std::shared_ptr<typename valuetype::element_type>>) { // 智能指针自动释放,无需手动 delete } // 普通对象类型,无需特殊处理 // 清空 map 元素 m.clear(); // 彻底释放底层内存 maptype().swap(m); } // ------------------- 示例 ------------------- struct mydata { int x; mydata(int v) : x(v) {} }; int main() { // 普通对象 map std::map<int, int> normalmap{{1,100},{2,200}}; // 原始指针 map std::map<int, mydata*> pointermap; pointermap[1] = new mydata(10); pointermap[2] = new mydata(20); // unique_ptr map std::map<int, std::unique_ptr<mydata>> uniqueptrmap; uniqueptrmap[1] = std::make_unique<mydata>(30); uniqueptrmap[2] = std::make_unique<mydata>(40); // shared_ptr map std::map<int, std::shared_ptr<mydata>> sharedptrmap; sharedptrmap[1] = std::make_shared<mydata>(50); sharedptrmap[2] = std::make_shared<mydata>(60); free_map_memory(normalmap); free_map_memory(pointermap); free_map_memory(uniqueptrmap); free_map_memory(sharedptrmap); std::cout << "all maps freed successfully." << std::endl; return 0; }
功能特点
delete
到此这篇关于c++ 中std::map内存管理详解的文章就介绍到这了,更多相关c++ td::map内存管理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论