2017-03-07 11 views
0

私が理解しているところでは、newという単語を使用するたびに、メモリリークを避けるためにdeleteを使用する必要があります。私の例では、push_back()に、newを使用して、私のベクトルに動的メモリを再割り当てします。私は、いつも私がpush_back()を使う度に、私はメモリの新しい部分を割り当てて、deleteが古いとは思っていません。もし私が正しいのであれば誰かが私のことを説明できるのですか?もし私が間違っていたら、私の理由を説明してください。カスタムベクタークラスでの動的メモリ再割り当て

class Vector { 
     double* ptr; 
     size_t size; 
     size_t max_size; 
     public: 
     Vector(): size{0}, max_size{1} { 
      ptr = new double(max_size); 
     } 
     ~Vector(){ 
      delete pointer; 
     } 
     void push_back(const double elem) { 
      if (size+1 == max_size) { 
       double* buf_ptr = ptr; 
       max_size*=2; 
       ptr = new double(max_size); 
      } 
      ptr[size] = elem; 
      size+=1; 
     } 
    }; 
+0

'new double(max_size)'は配列を割り当てないので、 'max_size'という値を持つ単一のdoubleを割り当てます。配列を割り当てるには: 'new double [max_size]'。そしてその配列を解放する: 'delete []'ではなく 'delete'。 – emlai

答えて

1

3つのこと:

  1. あなたは新しい割り当てが成功した後new double[maxsize](doubleの配列を割り当てる)、ないnew double(maxsize)(シングル、ダブル値を割り当てる)
  2. を使用したい、あなたはデータをコピーしたいです古い配列(例:with std::copy)から古いデータを削除するか、
  3. 新しい配列を割り当てて、古いデータをコピーしたら、古いアレイのデータを解放するためにdelete[] buf_ptrをコピーします。

そのすべてのメモリは、この行を交換することによって固定することができます。これらの行と

  ptr = new double(max_size); 

  ptr = new double[max_size]; 
      std::copy(buf_ptr, buf_ptr + size, ptr); 
      delete[] buf_ptr; 

は、ソースファイルの先頭にstd::copyため#include <algorithm>に確認してください。

注:コンストラクタとデストラクタを調整する必要があります。対応する配列ベースの形式はそれぞれnewdeleteです。

+0

私はstd :: copyを使わず、 "古いデータを床に落とす"ことなく動作します。たぶん私はあなたを誤解したでしょう。 –

+0

さて、私は理解しています)std :: copyを使う代わりに、データをコピーするループを使用できますか? –

+0

@VladimirSamoilenko:もちろん、あなたはできますが、なぜホイールを再発明するのですか? 'std :: copy'はループと同じ(あるいは非常によく似た)マシンコードにコンパイルする必要があります(ループを異常に悪く実装するとループよりも優れている可能性があります)。自己文書化コードは良いことです。 – ShadowRanger

関連する問題