[英]C++: using an iterator of dense_hash_set after erase(*it)
我有这个C ++代码文件 ,它是Expat许可下的FOSS 。 在代码上运行cppcheck时 ,出现此错误:
[google_hash.cpp:137] -> [google_hash.cpp:141]: (error) Iterator 'it' used after element has been erased.
有问题的代码是:
74 #if (FCS_WHICH_STATES_GOOGLE_HASH == FCS_WHICH_STATES_GOOGLE_HASH__SPARSE)
75 typedef sparse_hash_set<char *, state_hash, state_equality> StatesGoogleHash;
76 #else
77 typedef dense_hash_set<char *, state_hash, state_equality> StatesGoogleHash;
78 #endif
.
.
.
131 extern void fc_solve_states_google_hash_foreach(
132 fcs_states_google_hash_handle void_hash,
133 bool (*should_delete_ptr)(void *key, void *context), void *context)
134 {
135 StatesGoogleHash *hash = (StatesGoogleHash *)void_hash;
136
137 for (StatesGoogleHash::iterator it = hash->begin(); it != hash->end(); ++it)
138 {
139 if (should_delete_ptr(*(it), context))
140 {
141 hash->erase(it);
142 }
143 }
144 }
它使用http://goog-sparsehash.sourceforge.net/doc/sparse_hash_set.html或http://goog-sparsehash.sourceforge.net/doc/dense_hash_set.html 。
现在,这些文件说
Validity of Iterators
insert() invalidates all iterators, as does resize().
erase() is guaranteed not to invalidate any iterators.
所以我的问题是-我是否正确,安全地使用了集合的迭代器(并且cppcheck发出了误报),或者如果不是-应该如何修复代码?
帮助将不胜感激。
从cppcheck认为iterator
上称为erase
的API使迭代iterator
无效的意义上来说,这是一个误报。 这就是它使用的规则,因为这是一个明智的API。
那么对于这个代码,它似乎是有效的做++it
因为这样:
这是通过使delete()不调整哈希表的大小来实现的。 如果您需要最大的空间效率,则可以在一连串的delete()调用之后调用resize(0),以强制将哈希表调整为尽可能小的大小。
这似乎意味着,如果您在擦除之间不调用resize(0)
,则迭代器可能会遇到删除的对象。 在这里很好,因为擦除是在同一循环中完成的。
该代码通过不使其变得明显并且不使用标准模式来隐藏其行为的事实无济于事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.