代码之家  ›  专栏  ›  技术社区  ›  sharkin

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

  •  2
  • sharkin  · 技术社区  · 16 年前

    我正在检查静态代码分析工具的结果 Klocwork 是的。

    它抱怨以下代码:

    293 for( my_vector_typedef::iterator it( start_pos ); it != end_pos ; ++it ){
    294   delete *it;
    295 }
    

    显示以下消息:

    对象“it.\u current”在释放后使用。对象“it.\u current”在第293行被释放后,通过将参数1传递给第294行的函数“delete”使用

    我知道stl中的东西(特别是迭代器)有时并不是它们看起来的那样,所以我想了解发生了什么。故意把问题表述得很傻——删除是针对“它”所指的内容而不是“它”本身执行的,那么为什么它会抱怨它与“++it”一起使用呢?不是被删除了吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Timo Geusch    16 年前

    在我看来,这个工具有点困惑,因为您试图删除迭代器引用的对象。 ++it 只需用新值重新加载当前值,但这似乎会混淆工具。

    对我来说这看起来并不特别危险,所以我想看看你是否可以禁用这个警告。通常在使用静态分析工具时,您需要对它们稍加调整以匹配您的编码风格。

        2
  •  0
  •   Goz    16 年前

    在我看来,代码分析工具不能很好地理解解引用。我从未见过完美的代码分析工具。大多数人都有某种错误。如果代码在您检查之后看起来很好,那么可能是双重检查和三次检查,并且代码分析工具是错误的。

        3
  •  0
  •   Mike D.    16 年前

    您可以重写循环以增加 it delete 以下内容:

    my_vector_typedef::iterator it( start_pos );
    while(it != end_pos)
    {
        type_used_in_my_vector* x = *it++;
        delete x;
    }