1

コードをコンパイルすると警告が表示されます。警告は次のとおりです。ローカル変数 'str' への参照が返されました [デフォルトで有効] 何が問題なのか、何が間違っているのかわかりません..これは私のコードです.. .

MyString& operator+(MyString &a){
    char *tmp=new char[strlen(szArr)+strlen(a.szArr)+1];
    strcpy(tmp, szArr);
    strcat(tmp, a.szArr);
    MyString str(tmp);
    delete tmp;
    return str;
}
MyString& operator+(char *s){
    if(s)
        return *this;
    char *tmp=new char[strlen(szArr)+strlen(s)+1];
    strcpy(tmp, szArr);
    strcat(tmp, s);
    MyString str(tmp);
    delete tmp;
    return str;
}

両方のImでこの警告が表示されます..Imがオブジェクトを返すと不平を言っている理由がわかりません..

4

5 に答える 5

3

関数が戻るときにスコープ外になるローカル (スタック) 変数への参照を返しています。オブジェクトは無効になるため、コンパイラはこれを行わないように警告しています。コピー コンストラクターが定義されていることを確認し、オブジェクトを値で返します (&戻り値の型から を削除します)。

于 2013-08-12T18:58:07.843 に答える
1

既存のオブジェクトではなく新しいオブジェクトを返す場合は、参照を返すべきではありません。参照トークンを削除します。(作成したオブジェクトは関数が戻るときに破棄されるため、参照は無効なオブジェクトを対象とします。非参照を返すことは、代わりにオブジェクトがコピー/移動されることを意味します。これはあなたが望むものです。コンパイラを最適化すると、とにかくコピーしてください。)

また、引数を変更しないconstため、constオブジェクト (または文字列リテラル) を渡すことができるように宣言する必要があります。

MyString& operator+(MyString &a);
MyString& operator+(char *s);

次のようにする必要があります。

MyString operator+(MyString const &a);
MyString operator+(char const *s);

このロジックは逆であることに注意してください。

if(s)
    return *this;

文字列がnullでない場合、これは何もしません。私はあなたがこれを意味したと推測します:

if(!s)
    return *this;
于 2013-08-12T18:58:15.797 に答える
0

MyString str(tmp);関数内に一時変数を作成し、その変数のメモリへの参照を返そうとしていますが、スコープ外になっています。

これがエラー メッセージの正確な理由かどうかはわかりませんが、その戻り値を何かに使用しようとするたびに発生する問題です。

于 2013-08-12T18:58:57.633 に答える
0

このエラーは、コンパイラが伝えていることとまったく同じです: You are return a reference to a local variable . ローカル変数はスタックに格納され、関数が終了するとそのローカル変数はスコープ外になるため、ローカル変数への参照を返すと未定義の動作になります。
値渡しを使用する必要があります。

于 2013-08-12T18:59:38.770 に答える
0

別の提案: 演算子形式を 2 つの関数パラメーターと共に使用し、参照渡しを維持することができます。

例については、こちらをご覧ください

于 2013-08-12T19:10:29.830 に答える