Cスタイルの文字列ペアを格納するためにC++のhash_mapを使用しています。そして、すべてのキーは、このケースで一意でなければなりません。重複キーの場合のSTL hash_mapのキー/値の削除に関する問題
これは、複数の実行でストレステストを行うと重大なメモリリークです。
これらのキーが一致しない場合、メモリリークは発生しません。しかし、同一のキーその別の話...
hash_map(これはGoogleのsparsehashですが、それは完全にSGIの機能を実装)
sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;
と私は/検索し、キーを交換する機能を見つけることができませんでした同じキーを持つvalペア。
values[k]=v;
は、キーが同じでも新しいペアを追加します。 (これはトグル可能でなければならないと思う) - これはhash_map.insert()以外の何ものでもありません。
私はキーが存在するかどうかをチェックする機能を持っています。新しいペア:最初に
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++の文字列を使うことができますが、私はしたくないと思います。組み込みシステムの場合、これを真実に保つことを試みています。どんな助けにも感謝しています...
実際のコードを投稿していないことは明らかです。そうしてみると、誰もが簡単に使えるようになります。 –
そのコードはemacsから直接出ます。私はもう少し手伝ってくれました。 – EdH