2016-05-05 4 views
2

以下のVectorクラスのデストラクタには、使用するメモリをキャンセルするにはifステートメントが必要です。 arrにメンバーが1人いる場合はdelete arrとなります。 arrにメンバーが多い場合は、delete[] arrを使用する必要があります。C++:デストラクタのif文が必要ですか?

教えてもらえますか?

マイコード:

class Vector { 
    double * arr; 
    short dim; 

public: 
    Vector(short d = 0): dim(d) { 
     arr = NULL; 
     if (dim < 0) { 
      dim = 0; 
     } else { 
      arr = new double[dim]; 
     } 
    } 

    ~Vector() { 
     if (arr != NULL) { 
      if (dim == 1) { 
       delete arr; 
      } else { 
       delete[] arr; 
      } 

      arr = NULL; 
      dim = 0; 
     } 
    } 
}; 
+2

"もし' arr'が1つのメンバを持っていれば 'delete arr'を持っています"あなたはそれをどう思いますか? – juanchopanza

+0

関連していないので、私はこれの 'dim'メンバには何も理由がなく、*初期化するために提供された構築パラメータも* signed *ではありません。このようなことについては、 'std :: size_t'がより適切でしょう。 – WhozCraig

+3

'arr'を' NULL'に、 'dim'をデストラクタの終わりで' 0'に設定するのは、オブジェクトがなくなるため無意味です。誰もそれらの価値観を見ることはありません。そして、 'NULL'のテストは必要ないので、デストラクタ本体ははるかに単純になります:'〜vector(){delete [] arr; } '。 –

答えて

10

だけでなく、それはそれだけで間違っている、必要はありません。 new []で作成されたものは、delete []でのみ削除できます。それ以外の場合は、未定義の動作が作成されます。

4

どこでもnew double;に電話することはないので、不要です。常にdelete [] arr;に電話してください。また、NULLを確認する必要もありません。

6

これは必須ではないだけでなく、new[]でメモリを割り当てるため、これは不正です。 newに電話する場合はdeleteが必要です。new[]に電話する場合はdelete[]が必要です。それらを混在させることは未定義の動作です。あなたのベクトルそれは次のようになります。今、私たちは正しいのコピーを持っているし、削除nullptr上の非OPであるか、または正しくコンストラクタから割り当てられたメモリを解放するか

class Vector { 
    double * arr; 
    short dim; 

public: 
    Vector(short d = 0): dim(d) { 
     if (dim > 0) 
      arr = new double[dim] 
     else 
      arr = nullptr; 
    } 

    Vector(const Vector& copy) : dim(copy.dim) { 
     if (dim > 0) { 
      arr = new double[dim] 
      // copy data here 
     } 
     else 
      arr = nullptr; 
    } 

    ~Vector() { 
     delete [] arr; 
    } 

    Vector & operator=(Vector rhs) { 
     // swap the contents of the copy. you can make a swap function to do this 
     double * temp = arr; 
     arr = rhs.arr; 
     rhs.arr = temp; 
     dim = rhs.dim; 
    } 

}; 

を。

+0

IMO、コピーコンストラクタを指定した場合は、コピー代入演算子も必要です。 – HolyBlackCat

+0

@HolyBlackCat良い提案。私はコンストラクタを表示するためにそれを残しました。私は基本的な例を加えました。 – NathanOliver

2

これは必須ではありません。新しいキーワードを使用して割り当てられたメモリを作成するときは、大括弧を使わずにメモリを削除することを忘れないでください。

関連する問題