Cplusplus-cpp-dynamic-memory

提供:Dev Guides
移動先:案内検索

C ++ダイナミックメモリ

C で動的メモリが実際にどのように機能するかをよく理解することは、優れたC プログラマになるために不可欠です。 C ++プログラムのメモリは2つの部分に分かれています-

  • スタック-関数内で宣言されたすべての変数は、スタックからメモリを占有します。
  • ヒープ-これはプログラムの未使用メモリであり、プログラムの実行時にメモリを動的に割り当てるために使用できます。

多くの場合、定義済み変数に特定の情報を格納するために必要なメモリの量を事前に認識しておらず、必要なメモリのサイズは実行時に決定できます。

割り当てられたスペースのアドレスを返すC ++の特別な演算子を使用して、特定のタイプの変数のヒープ内で実行時にメモリを割り当てることができます。 この演算子は new 演算子と呼ばれます。

動的に割り当てられたメモリがもう必要ない場合は、 delete 演算子を使用できます。これは、新しい演算子によって以前に割り当てられたメモリの割り当てを解除します。

新規および削除演算子

*new* 演算子を使用して任意のデータ型にメモリを動的に割り当てる一般的な構文は次のとおりです。
new data-type;

ここで、 data-type は、配列を含む組み込みデータ型、またはクラスまたは構造を含むユーザー定義のデータ型です。 組み込みのデータ型から始めましょう。 たとえば、double型へのポインターを定義し、実行時にメモリを割り当てるように要求できます。 私たちは次のステートメントで*新しい*演算子を使用してこれを行うことができます-

double* pvalue  = NULL;//Pointer initialized with null
pvalue  = new double;  //Request memory for the variable

空きストアが使い果たされた場合、メモリは正常に割り当てられなかった可能性があります。 だから、新しい演算子がNULLポインタを返しているかどうかを確認し、以下のように適切なアクションを取ることは良い習慣です-

double* pvalue  = NULL;
if( !(pvalue  = new double )) {
   cout << "Error: out of memory." <<endl;
   exit(1);
}

Cの* malloc()*関数はまだC に存在しますが、malloc()関数の使用を避けることをお勧めします。 malloc()に対するnewの主な利点は、newがメモリを割り当てるだけでなく、C の主要な目的であるオブジェクトを構築することです。

動的に割り当てられた変数が不要になったと感じるときはいつでも、次のように「削除」演算子を使用して、フリーストアで占有しているメモリを解放できます-

delete pvalue;       //Release memory pointed to by pvalue

上記の概念を入れて、「新規」と「削除」がどのように機能するかを示すために次の例を形成しましょう-

#include <iostream>
using namespace std;

int main () {
   double *pvalue  = NULL;//Pointer initialized with null
   pvalue  = new double;  //Request memory for the variable

  * pvalue = 29494.99;    //Store value at allocated address
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;        //free up the memory.

   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Value of pvalue : 29495

配列の動的メモリ割り当て

文字の配列、つまり20文字の文字列にメモリを割り当てることを検討してください。 上記で使用したものと同じ構文を使用して、以下に示すようにメモリを動的に割り当てることができます。

char* pvalue  = NULL;        //Pointer initialized with null
pvalue  = new char[20];      //Request memory for the variable

作成したばかりの配列を削除するには、ステートメントは次のようになります-

delete [] pvalue;            //Delete array pointed to by pvalue

new演算子の同様の一般的な構文に従って、次のように多次元配列に割り当てることができます-

double** pvalue  = NULL;     //Pointer initialized with null
pvalue  = new double [3][4]; //Allocate memory for a 3x4 array

ただし、多次元配列のメモリを解放する構文は上記と同じままです-

delete [] pvalue;           //Delete array pointed to by pvalue

オブジェクトの動的メモリ割り当て

オブジェクトは単純なデータ型と変わりません。 たとえば、概念を明確にするためにオブジェクトの配列を使用する予定の次のコードを検討してください-

#include <iostream>
using namespace std;

class Box {
   public:
      Box() {
         cout << "Constructor called!" <<endl;
      }
      ~Box() {
         cout << "Destructor called!" <<endl;
      }
};
int main() {
   Box* myBoxArray = new Box[4];
   delete [] myBoxArray;//Delete array

   return 0;
}

4つのBoxオブジェクトの配列を割り当てると、Simpleコンストラクターが4回呼び出され、同様にこれらのオブジェクトを削除するときに、デストラクターも同じ回数呼び出されます。

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!