2


0

STLイテレーター-なぜコード分析ツールが文句を言うのですか?

静的コード分析ツールhttp://www.klocwork.com/[Klocwork]の結果を確認しています。

次のコードについて文句を言います。

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

次のメッセージとともに:

オブジェクト 'it._M_current’は、解放後に使用されます。 オブジェクト 'it._M_current’は、行294 *で関数 'delete’に引数1を渡すことによって解放された後、行293で使用されました

STLの物(特にイテレータ)が実際に見た目と違う場合があることを知っているので、何が起こっているのかを理解したいと思います。 意図的に質問を愚かに定式化する-「削除」は「それ」自体ではなく、「それ」が指しているものに対して実行されるので、「++ it」で使用されていることに文句を言うのはなぜですか? 削除されたのはそれではないのですか?

3 Answer


1


このツールは、イテレータitが参照するオブジェクトを削除しようとしているという事実に少し混乱しているように見えます。 `++ it`は単に_M_currentを新しい値でリロードするだけですが、これはツールを混乱させるようです。

私には特に危険ではないので、この警告を無効にできるかどうかを確認したいと思います。 通常、静的分析ツールでは、コーディングスタイルに合わせて少し調整する必要があります。


0


コード分​​析ツールは逆参照をよく理解していないようです。 完璧なコード分析ツールを見たことがありません。 ほとんどには何らかのエラーがあります。 チェック、ダブルチェック、トリプルチェックを行った後、コードが正常に見える場合は、おそらくコード分析ツールが間違っています。


0


delete`の前に it`をインクリメントするようにループを書き直すことができます:

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