C++STL map容器の値がポインタの時どのようにメモリを解放します
9585 ワード
最近STLでmapを使用しているとき、mapの値がポインタオブジェクトの場合、メモリをどのように解放するかという問題が発生しました.
std::listで要素を削除するのは簡単です.eraseメソッドを直接使用すればいいです.コードは次のとおりです.
あるいはもっと簡単に
しかし、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
もちろん、この方法はstd::listなどにも適しています.
参考資料:C++遍歴でstdを削除する::map要素C++map(STL map)削除要素(erase関数で要素を削除する)stl 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コンテナでのポインタの解放を詳しく説明する