1

次のようなコードを書くと、valgrind の問題が発生します。

static std::string function(std::string test)
{
        size_t pos = test.find(',');
        if (pos == test.npos)
        {
            // no comma
            //
            pos = test.length();
        }

        return test.substr(0, pos); //Valgrind is reporting possibly lost bytes here

}

今私の質問は、代わりにこれを行うべきですか?

static std::string function(std::string test)
{
        size_t pos = test.find(',');
        if (pos == test.npos)
        {
            // no comma
            //
            pos = test.length();
        }
        static std::string temp = test.substr(0, pos);
        return temp;

}

temp静的な文字列を持つことは重要だと思います。なぜならfunction静的であるため、返されるものはfunctionすべてカプセル化されたオブジェクトと同じ寿命を持つ必要があるからfunctionです。それとも私の分析に欠陥がありますか?

ありがとうございました

4

4 に答える 4

2

valgrindの問題が発生しています

その通り!これはValgrindの問題であり、コードの問題ではありません。Valgrindは常に正しいとは限らず、この場合、誤った警告を発します。無視してください。

今私の質問は、代わりにこれを行うべきですか?

いいえ。静的関数と静的変数は2つの異なるものです。また、コードの2番目のバージョンでは、マルチスレッド環境で発生する可能性のある問題が発生します。

于 2013-01-31T19:22:03.247 に答える
2

最初のスニペットは問題ありません。2 番目のスニペットはまったく問題ありません (最初に使用したときにのみ正しく動作することが保証されています)。

他の誰もが Valgrind を無視するように言っているようです。そうしないでください。コードの残りの部分を見せてくれませんでした。他の場所に問題があり、ここでしか現れていない可能性は十分にあります。

2 番目の選択肢は、C++ ライブラリが変なことをしており、Valgrind が不必要にトリガーされていることです。その場合、解決策は抑制ファイルを使用することです。ただし、ライブラリの問題であると100%確信している場合にのみ、これを行う必要があります。そうしないと、将来的に偽陰性が発生する可能性があります。

于 2013-01-31T19:35:08.560 に答える
2

そうしないと、スレッドの安全性が失われます。最初の関数は良好で、メモリ リークはありません。一時的なものを作成しますstd::stringが、大丈夫です。心配する必要はありません。割り当てられたメモリを完全に処理します。valgrind の警告を一字一句読む必要あります。これで、何も失われていないことを確認できます。IIRC には、valgrind に今回はすべて問題ないことを伝える可能性があります。

于 2013-01-31T19:27:37.503 に答える
2

今私の質問は、代わりにこれを行うべきですか?

いいえ、絶対に違います。そのような一時的なものを作成する必要はありません(特にstatic、関数を再入不可にするか、最終的にはあなたのケースで初めて機能するものではありません)。ヴァルグリンドはここでゴミを報告していると思います。あなたのコードはそのままのように見えます。

それとも私の分析に欠陥がありますか?

はい、そうです。とにかく、staticクラスメソッドにはオブジェクトが関連付けられていないため、個別のライフタイムを持つ可能性があります(通常の非クラス関数と同様ですが、呼び出すときにクラス名でスコープする必要があるだけです)。それ以外は、stringとにかく一時的な参照を返すのではなくtemp、 からコピーされた新しいオブジェクトを返すため、ここで考慮すべき寿命の問題はありません。

それ以外では、testオブジェクトを変更したりコピーしたりしないため、const-reference によってオブジェクトを取得することを検討することをお勧めします (これは、オブジェクトのアイデンティティとオブジェクトの値に関する一般的な誤解に関連している可能性がありますか?)。

于 2013-01-31T19:27:47.417 に答える