C++ での動的メモリ割り当て

C Deno Dong Dememori Geri Dangte



通常、C++ プログラミング言語でソース コードを使用している間、コンパイラはデータの格納用の変数に手動でメモリを割り当てます。静的メモリの割り当てと言われています。これは、一度宣言すると変更できない固定メモリです。このタイプのメモリ割り当てでは、オペレーティング システムはスタックを使用してデータを格納します。静的割り当てでは、ソース コードの実行が開始される前にメモリが割り当てられます。

一方、動的メモリ割り当てでは、実行が開始されている間にメモリが割り当てられます。このメモリは、実行時にプログラマによって手動で割り当てられます。C++ では実行時メモリ割り当てとも呼ばれます。動的メモリのサイズは、宣言時に固定できるサイズについて言及していないため、プログラムの任意の位置で変更できます。変数に値を直接提供するだけです。

通常の変数へのメモリ割り当ての違い

通常の変数では、コンパイラによって割り当てられたメモリが自動的に割り当てられ、割り当て解除されます。メモリがプログラマによって動的に割り当てられた場合、プログラマは、メモリがソース コードの以降の実行に使用されなくなったときにメモリを削除または割り当て解除する必要があります。この状況は、メモリの割り当てが解除されていない状態でプログラムが終了すると、「メモリ リーク」を引き起こします。







動的割り当ての演算子

C++ では、2 つの演算子がメモリの割り当てと割り当て解除に役立ちます。「new」と「delete」は、より適切な方法でメモリの割り当てと割り当て解除に使用されます。



新しいオペレーター

これは、メモリ割り当ての要求を示します。 new 演算子はメモリを初期化し、十分なメモリが利用可能な場合は、割り当てられたメモリのアドレスをポインタ変数に返します。



ポインター オブジェクト = 新着 データ - タイプ ;

演算子を削除

new 演算子と同様に、delete 演算子は割り当てられたメモリを削除するために使用されます。 C++ では、プログラマはこの演算子を使用して割り当てを解除できます。





# pointer_variable を削除します。

例 1

この例では、2 つのポインターを導入します。1 つは整数型ポインターで、もう 1 つは浮動小数点ポインターです。ポインターは、アスタリスク記号を使用して初期化されます。

# Int * pointInt;
# フロート *pointfloat;

これら 2 つのプリンターを使用して、メモリを動的に割り当てます。



動的割り当てにおけるポインターの役割:
ストレージスペースのメモリは、ブロックの形で開発されています。プログラムを実行したり操作を実行したりするたびに、その特定の目的のためにメモリが割り当てられます。そのメモリには、そのメモリに許可されているプロセスまたはプログラムを識別するプログラムに関連付けられた特別なアドレスがあります。メモリスロットは、それが属するアドレスを介してアクセスされます。したがって、このアドレスはポインターを介して格納されます。つまり、メモリにアクセスするためのポインタと、同様に、メモリの特定の部分を任意のタスクに割り当てるためのポインタが必要です。アドレスを格納するにはポインタが必要です。

手動割り当てではメモリの動的割り当てに「new」キーワードが使用されるため、メモリはコンパイラによって割り当てられます。実行時にメモリを割り当てる必要はありません。ただし、動的割り当てはランダムであるため、ポインターを識別する必要があり、バインド プロセスにはこの新しい演算子が使用されます。

# Pointint = 新しい int;

同様に、浮動ポインタも同様にバインドされます。バインド プロセスの後、任意の操作のために予約するメモリに任意の値を割り当てます。ポインターを宣言することにより、特定の値をメモリに割り当てます。

# *pointInt = 50;

ポイント floats の float 値も宣言されます。割り当て後の値を表示します。

すでに説明したように、「new」演算子は割り当てに使用され、「delete」はメモリの割り当て解除に使用されます。したがって、コード内のタスクまたは操作が完了したら、タスクに割り当てたメモリを削除します。

他のプロセスがこれを利用できるように、メモリのその部分の割り当てを解除することをお勧めします。この割り当てを両方のポインターに適用します。

ポイントを削除 浮く ;

コードをテキスト エディタに保存すると、Ubuntu ターミナルで g++ コンパイラを介してファイル内のソース コードを実行できます。

$ g++ -o mem mem.c
$ ./メモリ

実行すると、メモリに割り当てられた値が表示されます。

例 2

この例には、ユーザーの操作が含まれています。ユーザーからの値を含む数値変数を取得します。このプログラムは、結果を学生の GPA に保存します。すべての結果は実行時に保存されます。

ユーザーが生徒数を入力すると、各数値に対してメモリが割り当てられます。結果のメモリ割り当てに使用される浮動小数点型ポインタがここで初期化されます。

GPA は 10 進数表記であるため、ポインターは float で取得します。 GPA には多数の学生が含まれる可能性があるため、ポインター型の配列を使用します。

ポインター = 新着 浮く [ 一つに ]

「new」キーワードを含むこのポインター配列は、実行をメモリにバインドします。 GPAは学生ごとに入力されます。ユーザーが追加したい学生の数に慣れていないため、for ループを使用して、入力した数まで GPA を入力しました。ループが繰り返されるたびに、ユーザーは生徒を識別する結果を入力するように求められます。結果が保存されたら、再びループを使用して学生のすべての GPA を表示します。最後に、動的ストレージの目的が達成されたため、ポインター型配列は削除されます。

消去 [ ] ポイント ;

次に、上記のコードを実行します。ユーザーは最初に生徒数を入力するよう求められます。次に、各学生の GPA が入力されます。

例 3

この例では、クラスのオブジェクトに new および delete 演算子を使用しています。このクラスには、年齢を格納する整数型のプライベート変数が含まれています。クラスの public 部分では、年齢を数値「10」に初期化するコンストラクターが作成されます。ここでは、コンストラクターで初期化された年齢を表示する別の関数が使用されています。

次に、動的割り当てのメイン プログラムに進みます。クラスのオブジェクトは動的に作成されます。

学生 * ポイント = 新着 学生 ( ) ;

オブジェクトが形成されると、コンストラクターが自動的に実装されます。年齢を取得する関数呼び出しが行われます。これは、ptr を介して行われます。

ポインター - > getAge ( ) ;

そして最後に、記憶が解放されます。

結論

動的メモリ割り当ては、コンパイラによって識別される固定ストレージの代わりに、プログラマによって実行時の実行時に割り当てられます。この割り当てはランダムに行われ、使用後に削除できます。一方、ほとんどの場合、削除前に実行プロセスが停止し、この動的割り当てによりメモリ リークが発生します。この現象は、C++ プログラミング言語を使用して、Ubuntu Linux システムのさまざまなアプローチで実装されています。