メモリポインタ値を解放する方法はC ++ STLマップコンテナです



How Release Memory Pointer Value Is C Stl Map Container



最近、STLマップを使用しているときに問題が発生しました。つまり、ポインタオブジェクトの値がマップのときにメモリを解放する方法を教えてください。

// site and the TCP connection mapping table (key is ip_port_stationCode, value is clientSocket *) std::map<String, DataUpload*> g_TcpConnMap // traverse list of sites, id for each server [ip: port] of each station (station code) to establish a TCP connection for (auto& staionItem : server.Host().stationListConf) { // ip_port_stationCode server port address _ _ site code uniquely identify a TCP connection 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)) } // release resources for (auto iter = g_TcpConnMap.begin() iter != g_TcpConnMap.end() ) { auto second = iter->second if (second) { delete second // release the pointer second = NULL g_TcpConnMap.erase(iter++) // delete elements from the map, note that the wording 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())

ただし、voiderase(イテレータpos)、これはイテレータの定義に従って次の要素への消去STL std :: mapを返さないため、メソッドstd :: listを使用することはできません。
真実は、連想コンテナの「消去」は、消去される要素を指すイテレータを除いて、イテレータを無効にしないということです(これは、「sid :: list」にも当てはまります)。このため、イテレータを返すために「map :: erase」は実際には必要ありません。これを行うだけです



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

もちろん、この方法はstd :: listなどにも適しています。

参照:
C ++ std ::マップトラバーサルは削除された要素です
要素を削除するためのC ++マップ(STLマップ)(要素を削除するための消去機能)コメント
Stlマップコンテナリリースポインタ