1

操作に使用できるクラスの例を次に示します+

class A
{
public:
   int *array;

   A()
   {
      array = new int[10];
   }

   ~A()
   {
      delete[] array;
   }

   A operator+ (const A &b)
   {
      A c;
      for(int i=0; i<10; i++)
         c.array[i] += array[i] + b.array[i];
      return c;
   }
};

int main()
{
   A a,b,c,d;

   /* puts some random numbers into the arrays of b,c and d */
   a = b+c+d;
}

a結果をコピーする前にデストラクタを実行しb+c+dますか? そうでない場合、メモリがリークしていないことを確認するにはどうすればよいですか?

演算子の+オーバーロードは、オペランドが変更されないようにこのように設計されています。

4

2 に答える 2

9

A に equals 演算子を追加する必要があります。また、コピー コンストラクターを作成することもできます

a が b+c+d からの戻り値になると、arrayポインタ inは呼び出されることaなく上書きされます。delete[]を削除する operator= を作成する必要がありarrayます。

operator= の例を以下に示します。

A& operator=(A const& a)
{
    if (&a != this) {
        int* tmp = this->array;
        this->array = new int[10];
        //copy a.array to this->array
        delete[] tmp;
    }
    return *this;
}

を初めて使用する場合、これには多くの微妙な点がありますoperator=

特に、次のように書くことは完全に有効であるため、a等しいかどうかのチェックが必要です。this

A a;
a = a;

これは無意味なコピーを引き起こし、ほとんどの場合operator=バグを引き起こします。

もう 1 つの微妙な点は、コーディング スタイルの 1 つ以上の要件よりも要件ではありません (非常に広く普及している標準ですが)。動的に割り当てられたものをコピーするときは、解放する前に常に割り当ててコピーする必要があります。そうすれば、 new が例外をスローした場合 (または他の何かが失敗した場合)、オブジェクトはまだ安定した状態にありますが、新しい期待される日付ではなく古いデータになります。

于 2012-04-28T08:38:30.197 に答える
2

これによりメモリリークが発生しますか?

はい、そうなります。コピー コンストラクターと代入演算子を追加するのを忘れました。3 のルールを参照してください

の代わりにstd::vector<int>forを使用することもできます。この場合、コピー コンストラクター/代入演算子について心配する必要はありません (デストラクターで処理する必要があるものを追加しない限り)。A::arrayint*

于 2012-04-28T08:48:56.167 に答える