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 eraseed(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コンテナでのポインタの解放を詳しく説明する