Я использую C ++ hash_map для хранения некоторых пар строк в стиле C. И все ключи должны быть уникальными для этого случая ...
Моя проблема заключается в серьезной утечке памяти при стресс-тестировании в течение нескольких прогонов.
Когда ни один из этих ключей в тесте не идентичен, утечка памяти отсутствует. Но с одинаковыми ключами это другая история ...
hash_map (это sparsehash от Google , но он полностью реализует функции SGI)
sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;
Я искал и не смог найти функцию для замены пары ключ / вал с идентичным ключом.
values[k]=v;
добавит только новую пару, даже если ключ тот же. (поведение, которое я считаю переключаемым) - это не что иное, как hash_map.insert ()
Итак, у меня есть функция, чтобы проверить, существует ли ключ, и заменяет ли он val, а если нет, просто добавить новую пару:
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
изначально пары добавляются так:
old = replaceOrStoreVal(recordname, value);
Вылетает при первом дубликате ключа.
2 способа, которыми я пробовал это. Вариант 1 приводит к segfault при стирании (что меня также озадачивает). Вариант 2 просто не решает проблему, все еще есть утечка памяти. Может быть, я просто делаю все это неправильно.
Да, я знаю, что могу использовать строки C ++, но я не хочу. Попытка сохранить этот настоящий свет для встроенной системы. Любая помощь приветствуется ...