3

コードを cppcheck でチェックしたところchar outStr[256]、コンストラクターの初期化リストでフィールドを初期化する必要があると表示されました。

warning: Member variable 'outStr' is not initialized in the constructor.

このフィールドは、次のメソッドでのみ使用されます。

const char* toStr(){
    sprintf(outStr,"%s %s", id.c_str(), localId.c_str());
    return outStr;
}

c("")初期化子リストに追加する方が良いですか? またはcppcheckが間違っていますか?またはそれを回避する他の方法はありますか?

4

3 に答える 3

6

私は Cppcheck 開発者です。

その cppcheck 警告は、コンストラクターで初期化されていないすべてのデータ メンバーに対して書き込まれます。メンバーが後で使用される方法/場合に関係なく。

警告を修正するには、コンストラクターで配列を初期化します。最初の要素を初期化するだけで十分です。たとえば、これをコンストラクターに追加します。

outStr[0] = 0;

または、それが好きな場合:

sprintf(outStr, "");
于 2014-12-14T20:20:14.827 に答える
4

そもそもクラスにそのフィールドを持たないようにします。固定サイズのバッファへの使用sprintfは安全ではなく (出力が 255 文字を超える場合はどうなるでしょうか?)、toStr関数が返されたときに配列が存在し続けるように、オブジェクトの有効期間全体にわたって配列が存在するのは厄介です。

代わりにオブジェクトtoStrを返すように変更することを検討してください。std::stringこれにより、実装が簡単になります — return id + ' ' + localId— そして、文字列オブジェクトは、連結の結果を保持するのに十分なメモリを自動的に割り当てます。を呼び出すコードでは、生の文字配列が本当に必要な場合は、返された文字列に対して をtoStr呼び出すことができます。.c_str()

于 2014-12-14T17:17:00.620 に答える
2

CppCheck は少し熱心すぎます。ただし、 C++ 11 を使用していて、オーバーヘッドを気にしない場合、そのメンバーを初期化することで、それをシャットダウンして事故を防ぐことができます (このオブジェクトの構築が実際にパフォーマンスでない限り、オーバーヘッドは最小限または無視できます-アプリケーションの重要な部分)。

于 2014-12-14T17:51:53.063 に答える