前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ STL map容器值为指针时怎么释放内存

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

作者头像
ccf19881030
发布2019-07-10 15:59:37
4.7K0
发布2019-07-10 15:59:37
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

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

代码语言:javascript
复制
// 站点与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方法即可,代码如下:

代码语言:javascript
复制
for(iter = list.begin(); iter != list.end();) {
if (shouldDelete(*iter))
	iter = list.erase(iter);
else
	++iter;
}

或者更简单点

代码语言:javascript
复制
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

代码语言:javascript
复制
for(iter = map.begin(); iter != map.end();) {
  if (shouldDelete(*iter))
     map.erase(iter++);
  else
     ++iter;
}

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档