C スタイルの文字列ペアを格納するために C++ hash_map を使用しています。この場合、すべてのキーは一意である必要があります...
私の問題は、これを複数回実行してストレステストを行うと、重大なメモリリークが発生することです。
テストでこれらのキーがどれも同一でない場合、メモリ リークはありません。しかし、同じキーでは別の話です...
hash_map (これは Google のsparsehash ですが、SGI 関数を完全に実装しています)
sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;
検索したところ、同じキーを持つ key/val ペアを置き換える関数が見つかりませんでした。
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 では、消去時にセグメンテーション違反が発生します (これにも困惑します)。オプション 2 では問題が解決されず、メモリ リークが発生します。たぶん、私はこれをすべて間違っているだけです。
はい、C++ 文字列を使用できることはわかっていますが、使用したくありません。組み込みシステムのために、この本当の光を維持しようとしています。どんな助けでも大歓迎です...