0

次のデータ構造を使用するコードに奇妙なセグメンテーション違反があります:

map< uint64_t, set<uint64_t> > _key_to_block;

Valgrindは_key_to_block.erase(it)このメッセージに不満を言っています:

Address 0x6106118 is 56 bytes inside a block of size 88 free'd

次のようにマップから要素を消去する場合:

map< uint64_t, set<uint64_t> >::iterator it     = _key_to_block.find(key);
(it->second).clear();
_key_to_block.erase(it);

さらに、Valgrindも(it->second).insert(k);このマッサージについて不平を言っています:

Invalid read of size 8

次のようにSTLセットに要素を挿入します。

map< uint64_t, set<uint64_t> >::iterator it = _key_to_block.find(key);
(it->second).insert(value);

しかし、それはこの行について文句を言いません:

setit = it->second.find(value);

何か案が ?

4

1 に答える 1

1

チェックがないので、呼び出しで実際にキーが見つからず、イテレータが返されたend()と推測します。それを逆参照し始めると、振る舞いに対するすべての賭けは無効になります。を使用して常に要素を作成するか、の結果をに対して確認する必要があります。findendoperator[]findend

于 2013-02-11T01:09:46.753 に答える