Latest web development tutorials

C ++の動的メモリ

C言語で動的メモリを理解する++それが仕事は資格のC ++プログラマが不可欠になることである方法です。 C ++プログラムメモリは、2つの部分に分かれています。

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

多くの場合、実行時に必要なメモリのサイズを決定するために必要な特定の情報で定義された変数を格納するために必要なメモリ事前に予測することはできません。

C ++では、あなたは特別なオペレータが実行時にヒープ内のメモリの指定された型の変数に割り当てられている使用することができ、それが割り当てられたアドレス空間を返します。 この演算子は、新しい演算子であることとされています。

あなたが動的にメモリを割り当てる必要がない場合は、割り当てられたメモリの前に新しいオペレータによって削除delete演算子を使用することができます。

新しいおよび削除の演算子

ここでは、メモリのデータ型動的割り当てのいずれかの一般的な構文であるために、新しい演算子は、次のとおりです。

new data-type;

ここで、データ型は、任意の内蔵することができる配列を含むデータ型、ユーザ定義を含むクラスまたは構造体を含む、任意のタイプのデータとすることができます。私たちは最初の組み込みデータ型を見てみましょう。 例えば、我々は、メモリを要求し、double型のポインタへのポインタを定義することができ、メモリは実行時に割り当てられます。 私たちは、これを達成するために、次のステートメントに応じてnew演算子を使用することができます。

double* pvalue  = NULL; // 初始化为 null 的指针
pvalue  = new double;   // 为变量请求内存

無料の記憶領域が使い果たされている場合は、それが正常にメモリを割り当てるしない場合があります。 new演算子はNULLポインタを返すかどうかを確認し、次のように適切な措置をとることをお勧めします:

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

}

C言語のmalloc()関数は、C ++で登場し、まだ存在しているが、malloc関数()関数を使用しないことをお勧めします。 その主な利点と比較して、新しいとのmalloc()関数は、新しいメモリを割り当てるだけではなく、ということです、それはまた、オブジェクトを作成しました。

次のように任意の時点で、あなたは動的変数すでに割り当てられたメモリが不要になったことを感じていないとき、あなたは、それが使用するメモリを解放するには、delete演算子を使用することができます。

delete pvalue;        // 释放 pvalue 所指向的内存

上記の概念で使用される、次の例では、新しいを使用して演算子を削除する方法を示しています。

#include <iostream>
using namespace std;

int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // 释放内存

   return 0;
}

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

Value of pvalue : 29495

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

私たちは次のように文字列(20文字の文字列)は、我々は、メモリを動的に割り当てるために配列の構文の上記の例を使用することができますメモリを割り当てたいと仮定します。

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

次のように先ほど作成したアレイを削除するには、文は次のとおりです。

delete [] pvalue;        // 删除 pvalue 所指向的数组

ここでは、次のように一般的な構文new演算子は、多次元配列にメモリを割り当てることができます:

int ROW = 2;
int COL = 3;
double **pvalue  = new double* [ROW]; // 为行分配内存

// 为列分配内存
for(int i = 0; i < COL; i++) {
    pvalue[i] = new double[COL];
}

多次元配列のメモリを解放:

for(int i = 0; i < COL; i++) {
    delete[] pvalue[i];
}
delete [] pvalue; 

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

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

#include <iostream>
using namespace std;

class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};

int main( )
{
   Box* myBoxArray = new Box[4];

   delete [] myBoxArray; // Delete array

   return 0;
}

あなたはボックスは4つのオブジェクトは、メモリアレイを割り当てる含まれているしたい場合は、コンストラクタは、これらのオブジェクトを削除すると同じように、デストラクタが同じ回数(4回)と呼ばれる、4回呼び出されます。

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

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!