動的メモリ割り当てC ++を使用する方法は?



この記事では、C ++での動的メモリ割り当てについて説明します。これにより、リアルタイムリソースに対するメモリのニーズを検討できます。

C ++での動的メモリ割り当ては、リアルタイムリソースの必要性に対処するための要件を検討できるようにする非常に重要な機能です。この記事では、調査します 詳細な調査。この記事では、次のポインタについて説明します。

それでは、C ++での動的メモリ割り当てに関するこの記事から始めましょう。





Javaでのスキャナークラスの使用

動的メモリ割り当てが必要ですか?

たとえば、文を文字の配列として入力したいのですが、配列に必要な正確な文字数がわかりません。

ここで、文字配列を宣言しているときに、目的の文字列のサイズよりも小さいサイズを指定すると、配列に割り当てられたメモリ内のスペースが入力文字列のサイズに比べて小さいため、エラーが発生します。入力文字列のサイズよりも大きいサイズを指定すると、配列には目的の文字列のサイズよりもはるかに大きいスペースがメモリ内に割り当てられるため、不要な場合でもメモリを不必要に消費します。



上記の場合、コンパイル時(コンピューターがコードをコンパイルし、ユーザーが文字列を入力するとき)まで、配列の正確なサイズについてはわかりません。そのような場合、私たちは 新着 オペレーター。

C ++は2つの単項演算子を定義します 新着 そして 削除 実行時にメモリの割り当てと割り当て解除のタスクを実行します。これらの演算子(newおよびdelete)は、空きストアメモリ(ヒープメモリ)を操作するため、空きストア演算子とも呼ばれます。ポインタは、C ++の動的メモリ割り当てシステムに必要なサポートを提供します。

動的割り当ての助けを借りて、プログラムは実行時にメモリを取得できます。



グローバル変数とローカル変数は、コンパイル時にメモリに割り当てられます。ただし、実行時にグローバル変数またはローカル変数を追加することはできません。プログラムが可変量のメモリを使用する必要がある場合は、実行時に必要に応じてメモリを割り当てる必要があります。そしてもちろん、ここでは動的割り当てルーチンが目的を果たすことができます。

静的メモリ割り当てと動的メモリ割り当ての違い:

これは、C ++プログラムで使用される基本的なメモリアーキテクチャです。

メモリ-動的メモリ割り当て-Edureka

このような画像が必要になります

スタックは静的メモリ割り当てに使用され、ヒープは動的メモリ割り当てに使用され、どちらもコンピュータのRAMに保存されます。

静的メモリ割り当てがメモリに直接格納され、このメモリへのアクセスが非常に高速である間にスタックに割り当てられる変数。また、その割り当てはプログラムのコンパイル時に処理されます。関数またはメソッドが別の関数を呼び出し、その関数が別の関数を呼び出すなどの場合、これらすべての関数の実行は、最後の関数がその値を返すまで中断されたままになります。スタックは常にLIFO(後入れ先出し)の順序で格納され、最後に予約されたブロックは常に次に解放されるブロックです。これはスタックを追跡するのに役立ちます。スタックからブロックを解放することは、1つのポインターを調整することに他なりません。

ヒープに割り当てられた変数は、動的メモリ割り当て中に実行時にメモリが割り当てられます。このメモリへのアクセスはスタックに比べて少し遅くなりますが、ヒープのサイズは仮想メモリのサイズによってのみ制限されます。ヒープの要素には相互の依存関係がなく、いつでもランダムにアクセスできます。ブロックはいつでも割り当てて解放できます。これにより、ヒープのどの部分がいつでも割り当てまたは割り当て解除されているかを追跡することが困難になります。

C ++での動的メモリ割り当てに関するこの記事に進む

を使用したメモリの割り当て 新着 キーワード

C ++では 新着 演算子は実行時にメモリを割り当てるために使用され、メモリはバイト単位で割り当てられます。ザ・ 新着 演算子は、ヒープでの動的メモリ割り当ての要求を示します。十分なメモリが利用可能な場合は、 新着 演算子はメモリを初期化し、新しく割り当てられ初期化されたメモリのアドレスをポインタ変数に返します。

構文:

データ型* pointer_name =新しいデータ型

例:

int * ptr = new int //次の2つの方法で、動的割り当て中に変数を宣言できます。 int * ptr = new int(10)int * ptr = new int {15} // new演算子は、データ型のメモリのブロック(配列)を割り当てるためにも使用されます。 int * ptr = new int [20] //上記のステートメントは、int型の20個の整数にメモリを動的に割り当て、シーケンスの最初の要素へのポインタを「ptr」ポインタに返します。

注意 :ヒープに割り当てるのに十分なメモリがない場合、new演算子で「nothrow」が使用されていない限り、新しい要求は例外std :: bad_allocをスローして失敗を示します。この場合、NULLポインタが返されます。したがって、プログラムで使用する前に、newによって生成されたポインタ変数を確認することをお勧めします。

C ++での動的メモリ割り当てに関するこの記事に進む

を使用したメモリの割り当て解除 削除 キーワード:

ヒープメモリが変数またはクラスオブジェクトに割り当てられると、 新着 キーワード、を使用してそのメモリスペースの割り当てを解除できます 削除 キーワード。

構文:

deleteポインタ変数//ここで、pointer_variableは、newによって作成されたデータオブジェクトを指すポインタです。 delete [] pointer_variable //ポインタ変数が指す動的に割り当てられた配列メモリを解放するには、次の形式の削除を使用します。

例:

削除ptr削除[] ptr

注意 :オブジェクトの範囲またはオブジェクトの存続期間は、プログラムの実行中にオブジェクトがメモリに残っている時間です。ヒープメモリの割り当てはスタックよりも遅くなります。これは、ヒープではメモリを割り当てることができる特定の順序がないのに対し、スタックではLIFOに従うためです。

C ++での動的メモリ割り当てに関するこの記事に進む

配列を動的に割り当てる

動的メモリ割り当ての概念の主な用途は、サイズを指定して宣言する必要があるが、それについて確信が持てない場合に、メモリを配列に割り当てることです。

その使用法を理解するための例を見てみましょう。

#include using namespace std int main(){int len、sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] //動的メモリ割り当てcout<< 'Enter the marks of each student' << endl for( int i = 0 i>*(marks + i)} for(int i = 0 i

説明:
この例では、最初にクラスの生徒数をユーザーに尋ね、その値をlen変数に格納します。次に、整数の配列を宣言し、このステートメントを使用してlen変数に格納されている値に動的に等しいスペースをメモリに割り当てます。int* marks = new int [length]したがって、 'length *(サイズ1)に等しいスペースが割り当てられます。整数)'。コードの残りの部分は自明です。

C ++での動的メモリ割り当てに関するこの記事に進む

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

オブジェクトを動的に割り当てることもできます。

コンストラクターはオブジェクトの初期化に使用される特別なクラスメンバー関数であり、デストラクタはオブジェクトがスコープ外になるたびに呼び出されるクラスメンバー関数でもあることがわかっています。

デストラクタは、オブジェクトに割り当てられたメモリを解放するために使用できます。以下の条件で呼び出されます。

  • ローカルオブジェクトがスコープ外になるとき
  • グローバルオブジェクトの場合、演算子がクラスのオブジェクトへのポインタに適用されるとき

オブジェクトにメモリを動的に割り当てながら、ポインタを再び使用できます。

オブジェクトの配列の例を見てみましょう。

#include using namespace std class Random {public:Random(){cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

出力:

Informaticaでの変換の種類

説明:

Randomクラスの3つのオブジェクトにメモリを割り当てているため、コンストラクタは3回呼び出されます。デストラクタは、これらの各オブジェクトの間に3回も呼び出されます。 「Random * a = new Random [3]」このステートメントは、オブジェクトの動的メモリ割り当てを担当します。

これで、「動的メモリ割り当てC ++」に関するこの記事は終わりです。詳細を知りたい場合は、 信頼できるオンライン学習会社であるEdurekaによる。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Hibernate&SpringなどのさまざまなJavaフレームワークに加えて、コアJavaコンセプトと高度なJavaコンセプトの両方についてトレーニングするように設計されています。

質問がありますか?このブログのコメントセクションでそれについて言及してください。できるだけ早くご連絡いたします。