最近在使用STL中map时,遇到了一个问题,就是当map中值为指针对象时怎么释放内存?

// 站点与TCP连接映射表 (key为ip_port_stationCode, value为 clientSocket*)
std::map<String, DataUpload*> g_TcpConnMap; // 遍历站点列表,为每个服务器id[ip:port]的每个站点(station code)建立一个TCP连接
for (auto& staionItem : server.Host().stationListConf)
{
// ip_port_stationCode 服务器地址_端口_站点编码 唯一确定一个TCP连接
char strTcpCode[128] = { 0 };
sprintf(strTcpCode, "%s_%d_%s", host.host, host.port, staionItem.sscode); String strTcpTemp(strTcpCode); clientSocket* pclientSock=
new clientSocket(host.host, host.port); g_TcpConnMap.insert(std::make_pair(strTcpTemp, pclientSock));
} // 释放资源
for (auto iter = g_TcpConnMap.begin(); iter != g_TcpConnMap.end(); )
{
auto second = iter->second;
if (second)
{
delete second; // 释放指针
second = NULL;
g_TcpConnMap.erase(iter++); // 从map中删除元素,注意iter++的写法
}
} g_TcpConnMap.clear();

在std::list中删除一个元素非常简单,直接使用erase方法即可,代码如下:

for(iter = list.begin(); iter != list.end();) {
if (shouldDelete(*iter))
iter = list.erase(iter);
else
++iter;
}

或者更简单点

list.erase(std::remove_if(list.begin(), list.end(), shouldDelete), list_end());

然而根据STL std::map中的定义void erase(iterator pos),此erase并不返回下一个元素的迭代器,因此不能采用std::list的方法

The truth is that ‘erase’ in associative containers doesn’t invalidate any iterators except those that point to elements being erased (that’s also true for ’sid::list’). For this reason, you don’t really need ‘map::erase’ to return an iterator. Just do this

for(iter = map.begin(); iter != map.end();) {
if (shouldDelete(*iter))
map.erase(iter++);
else
++iter;
}

当然此方法同样也适合于std::list等。

参考资料:

C++遍历中删除std::map元素

C++ map(STL map)删除元素(erase函数删除元素)详解

stl map容器中指针的释放

最新文章

  1. baiduMap
  2. oracle 日期格式
  3. ie8解决F12问题
  4. SPOJ #691. Hotel Floors
  5. Android 百度地图API 定位 导航
  6. location.href的用户总结
  7. .Net程序员关于微信公众平台测试账户配置 项目总结
  8. 小SQL大作用
  9. poj 1442 Black Box(优先队列&amp;Treap)
  10. Django学习之十一:真正理解Django的路由分发和反解url原理
  11. h1-h3使用
  12. shell脚本while read line的使用
  13. Linux服务器中创建Oracle数据库实例
  14. 论文中“but”与“however”的区别
  15. Android设计和开发系列第二篇:Action Bar(Design)
  16. c#与IronPython Clojure-clr的调用
  17. 让HttpClient不要打印巨多的日志
  18. 008-Hadoop Hive sql语法详解3-DML 操作:元数据存储
  19. P3267 [JLOI2016/SHOI2016]侦察守卫
  20. 开启mysql远程访问

热门文章

  1. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
  2. SQL 常用语句(一)
  3. nginx负载均衡的搭建和简单例子
  4. redis-Nosql
  5. File基本操作
  6. SwiftUI 实战:从 0 到 1 研发一个 App
  7. Linux性能优化从入门到实战:12 内存篇:Swap 基础
  8. 使用Varnish加速Web
  9. P2617 Dynamic Rankings(待修改区间第k大)
  10. mysql 8.0.13 zip windows 10安装