0

プログラムを実行すると、プログラムが崩壊します。行をコメントアウトするif((str1->compare(*str2))==0 ){...}と、問題なく動作します。比較後に作成および削除する文字列 * の 2 つの要素を比較する方法がわかりません。

main.cpp: In function `int operator==(const Integer&, const Integer&)':
main.cpp:18: warning: taking address of temporary
main.cpp:19: warning: taking address of temporary

整数.h

class Integer {
public:
    Integer(int val, char *opis):m_val(val),m_opis(opis)
        {
            this->m_val = 0;
            this->m_opis = strdup("0");
        }

    friend int operator==(const Integer&,const Integer&);

      private:
        int m_val;
        char *m_opis;
}

main.cpp

    int operator==(const Integer&a, const Integer&b){
        string *str1 = &string ( a.m_opis );
        string *str2 = &string ( b.m_opis );

        if((str1->compare(*str2))==0 ){return 1 ;} //<- Here is my problem i think.

        delete str1;
        delete str2;

        return 0;
    }
}
//Objects and comparing

    Integer o1(15,"lala");
    Integer o2(150,"lala");
    Integer o3;

    cout<<o1==o2;
4

1 に答える 1

3

問題は、str1str2ポインタをぶら下げていることです。これは、それらが指す一時オブジェクトstr1->compare()が呼び出されるまでに存在しなくなったためです。これは、コンパイラが警告していることです。

ここでは動的オブジェクトを使用しないでください。スタックに割り当てられたオブジェクトを使用してください。

string str1(a.m_opis);
string str2(b.m_opis);

その他のポイント:

  • ( )std::stringの代わりに使用することをお勧めします。関連する3 つのルールとは何ですか?char*Integer.m_opis
  • m_opisはコンストラクターで 2 回設定されており、 のすべてのインスタンスはInteger同じ文字列になります"0"(同じは同じバッファーではなく同じ内容を意味します)。についても同様ですm_val
于 2012-05-22T15:57:28.757 に答える