专栏首页ccf19881030的博客C++ STL map容器值为指针时怎么释放内存

C++ STL map容器值为指针时怎么释放内存

最近在使用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等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode-8 字符串转换整数

    今天我们学习第8题字符串转换整数,这是一个字符串的中等题,像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我...

    用户3470542
  • 抽象类和接口的区别

    定义一个抽象类AbstractDoor,作为门的基类,同时定义一个alarmable的接口.(alarmable是我自己写的,我不知道有没有这个单词,大家懂就好...

    呼延十
  • LeetCode-22括号生成

    今天我们学习第22题括号生成,这是一道中等题。像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题...

    用户3470542
  • ActiveMQ 服务器的部署

    ActiveMQ 是 Apache 流行、强大的开源消息传递和集成模式服务器,它完全支持 JMS 1.1(严格实现“点对点”和“发布/订阅”两种消息模型) 和 ...

    IT技术小咖
  • dubbo 的 spi 思想

    spi,简单来说,就是 service provider interface,说白了是什么意思呢,比如你有个接口,现在这个接口有 3 个实现类,那么在系统运行的...

    IT技术小咖
  • 单例模式

    这篇是我开始进入设计模式的第一篇文章,Java一共有23种设计模式,我曾看过《大话设计模式》,书的内容当然都是干货满满,我当时看的是电子版,让我一度从入门到放弃...

    胖虎
  • ActiveMQ 客户端的开发

    上篇文章 ActiveMQ 服务器的部署 实现了 ActiveMQ 服务器的部署,本文分别以官方 API、Spring、SpringBoot 三种方式,实现 A...

    IT技术小咖
  • CopyOnWriteArrayList实现原理及源码分析

    CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来...

    胖虎
  • Arraylist和linkedlist的区别

    ArrayList和LinkedList可以说是日常业务开发中最常使用的容器类了,同时,他们的区别也是面试高发区,虽然很简单,但是我们总是不能说的完整,今天就通...

    呼延十
  • JavaBean基于注解实现校验

    前言 上一文我通过传递不合法参数触发异常,进行了统一拦截,那么这篇文章主要介绍JSR303,Hibernate Validator详细讲解及如何优雅的对参数进行...

    胖虎

扫码关注云+社区

领取腾讯云代金券