J'utilise C++ hash_map pour stocker certaines paires de chaînes de style C. Et toutes les clés devraient être uniques pour ce cas ...problème de suppression des clés/valeurs sur STL hash_map lors de la duplication des clés
Mon problème est une fuite de mémoire sérieuse lors d'un test de stress sur plusieurs passages.
Lorsqu'aucune de ces touches dans le test ne sont identiques, il n'y a pas de fuite de mémoire. Mais avec des clés identiques est une autre histoire ...
Le hash_map (ce qui est Google sparsehash mais il met en œuvre les fonctions de SGI entièrement)
sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;
J'ai cherché et ne pouvait pas trouver une fonction pour remplacer une clé/val paire qui a une clé identique.
values[k]=v;
ajoute une nouvelle paire, même si la clé est la même. (un comportement que je pense devrait être toggleable) - ce n'est rien d'autre qu'un hash_map.insert()
Donc j'ai une fonction pour vérifier si la clé existe, et si elle remplace le val, et si ce n'est pas juste ajouter un nouvelle paire:
char *confFile::replaceOrStoreVal(char *k, char *v) {
char *ret = NULL;
values.set_deleted_key(_DIST_KEY);
sparse_hash_map<const char*, char *, hash<const char*>, eqstr>::iterator it =
values.find(k);
if(it == values.end())
values[k] = v;
else {
// ret = it->second; // option 1
//it->second = v; // end option 1
//option 2
char *t = (char *) it->first;
ret = it->second;
values.erase(iter); <--- seg fault here
free(t);
values[k] = v; // end option 2
}
return ret;
} ... and ret is later free()ed
initialement paires sont ajoutés comme ceci:
old = replaceOrStoreVal(recordname, value);
Il se bloque sur la première clé en double.
2 façons j'ai essayé ceci. L'option 1 entraîne une erreur de segmentation sur l'effacement (quelque chose qui m'intrigue aussi). L'option 2 ne résout pas le problème, a toujours une fuite de mémoire. Peut-être que je fais juste tout faux. Oui, je sais que je pourrais utiliser des chaînes C++, mais je ne veux pas. Essayer de garder cette vraie lumière, pour un système embarqué. Toute aide est appréciée ...
Vous n'avez évidemment pas publié le vrai code - essayez de le faire, cela rend la vie plus facile pour tout le monde. –
c'est le code directement à partir d'emacs. J'ai ajouté un peu plus pour aider. – EdH