STL迭代器 - 为什么代码分析工具在抱怨?

时间:2009-12-09 11:53:27

标签: c++ templates stl iterator

我正在检查静态代码分析工具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中的东西(特别是迭代器)有时并不是它们看起来真的如此,所以我想了解发生了什么。故意将愚蠢的问题制定出来 - “删除”是针对'它'指向的,而不是'它'本身,所以为什么它会抱怨它与'++它'一起使用?它不是被删除了吗?

3 个答案:

答案 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;
}