我正在检查静态代码分析工具Klocwork的结果。
它抱怨以下代码:
293 for( my_vector_typedef::iterator it( start_pos ); it != end_pos ; ++it ){
294 delete *it;
295 }
使用以下消息:
对象'it._M_current'在被释放后使用。在通过将参数1传递给第294行的“删除”来释放后,在第293行使用了对象'it._M_current'
我知道STL中的东西(特别是迭代器)有时并不是它们看起来真的如此,所以我想了解发生了什么。故意将愚蠢的问题制定出来 - “删除”是针对'它'指向的,而不是'它'本身,所以为什么它会抱怨它与'++它'一起使用?它不是被删除了吗?
答案 0 :(得分:1)
在我看来,这个工具有点困惑,因为你试图删除迭代器引用的对象。 ++it
应该只使用新值重新加载_M_current,但这似乎会混淆该工具。
对我来说这看起来并不特别危险,所以我很想知道你是否可以禁用此警告。通常使用静态分析工具,您必须稍微调整它们以匹配您的编码风格。
答案 1 :(得分:0)
在我看来,代码分析工具不能很好地理解解除引用。我从未见过完美的代码分析工具。大多数都有某种错误。如果你检查后代码看起来很好,那么可能是双重检查和三重检查,代码分析工具是错误的。
答案 2 :(得分:0)
您可以在it
:
delete
my_vector_typedef::iterator it( start_pos );
while(it != end_pos)
{
type_used_in_my_vector* x = *it++;
delete x;
}