Comment libérer la valeur du pointeur de mémoire est le conteneur de carte C ++ STL

How Release Memory Pointer Value Is C Stl Map Container



Récemment, lors de l'utilisation de la carte STL, j'ai rencontré un problème, c'est-à-dire lorsque la carte comment libérer de la mémoire lorsque la valeur de l'objet pointeur?

// 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()

Dans std :: list, supprimer un élément est très simple et simple à utiliser avec la méthode d'effacement, comme suit:



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

Ou plus simplement



list.erase(std::remove_if(list.begin(), list.end(), shouldDelete), list_end())

Cependant void erase (iterator pos), cela ne retourne pas erase STL std :: map conformément à la définition de l'itérateur vers l'élément suivant, et ne peut donc pas être utilisé avec une méthode std :: list
La vérité est que «effacer» dans les conteneurs associatifs n'invalide aucun itérateur à l'exception de ceux qui pointent vers des éléments en cours d'effacement (c'est également vrai pour «sid :: list»). Pour cette raison, vous n’avez pas vraiment besoin de ‘map :: erase’ pour renvoyer un itérateur. Fais juste ça



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

Bien sûr, cette méthode convient également pour std :: list et ainsi de suite.

Les références:
C ++ std :: map traversal est des éléments supprimés
Carte C ++ (carte STL) pour supprimer des éléments (fonction d'effacement pour supprimer des éléments) Commentaires
Pointeurs de version de conteneur de carte stl