C++ でのメモリの割り当てと割り当て解除
コンパイラは、Java や Python などの他のプログラミング言語の変数に割り当てられるメモリを自動的に制御します。 しかし、C++ ではそうではありません。
作成以来、メモリの割り当てと割り当て解除は C++ 言語に不可欠でした。 プログラムの動的メモリの管理を担当します。これには、プログラムの実行中に使用されるメモリの割り当て、割り当てられたメモリが不要になったときの解放、およびプログラムの終了時に割り当てられたメモリがどうなるかの決定が含まれます。
メモリの割り当てと割り当て解除は、ページング手法を使用するオペレーティング システムの仮想メモリ マネージャーによって管理されます。
C++ プログラミング言語には、メモリの割り当てと解放を行う関数がいくつか用意されています。 これらの関数には、malloc
、calloc
、realloc
、free
、new
、および delete
が含まれます。
new
および delete
演算子から始めましょう。
new
および delete
演算子を使用してメモリの割り当てと割り当て解除を行う
new
演算子
new
演算子は、指定された型のオブジェクトにメモリを割り当てます。 まず、メモリ内に新しいオブジェクトを作成し、値で初期化できます。
値が指定されていない場合、デフォルトのコンストラクター を使用してオブジェクトが初期化されます。 new
演算子の構文は次のとおりです。
pointer - variable = new data - type
この場合、型データ型のポインタが使用されます。 配列を含む任意の組み込みデータ型、または構造体とクラスを含む任意のユーザー定義データ型をデータ型として使用できます。
プログラムの実行中に使用可能なメモリが不十分な場合はどうなりますか?
ヒープに割り当てるメモリが不足している場合、新しいリクエストは、タイプ std::bad alloc
のエラー メッセージをスローして失敗します。 ただし、nothrow
が new
演算子と一緒に使用された場合、そのシナリオでは NULL ポインターが返されます。 その結果、プログラムを実行する前に new
のポインター変数を探すことが不可欠です。
delete
演算子
delete
演算子は、new
演算子によって割り当てられたメモリを解放または解放します。 delete
演算子の構文は次のとおりです。
delete pArray;
ここで、pArray
は、new
演算子で割り当てられた配列を参照します。
通常、delete
演算子は次の 2つの機能を実行します。
- まず、デストラクタを呼び出してオブジェクトを破棄します。
- メモリの割り当てを解除します。
new
および delete
演算子の使用例:
#include <iostream>
using namespace std;
int main() {
int* x;
x = new int;
*x = 34;
cout << *x << endl;
delete x;
return 0;
}
この例では、最初に new
演算子を使用してメモリを割り当て、次に delete
演算子を使用して割り当てを解除しました。
ここをクリック 上記のコードの動作を確認します。
C 標準ライブラリを使用したメモリの割り当てと割り当て解除
malloc()
、free()
、および realloc()
を使用すると、C 標準ライブラリはメモリの割り当てと割り当て解除を容易にします。 これらの関数は、C++ 言語で使用できます。
malloc()
関数
malloc()
は、指定されたサイズの連続したメモリ空間を割り当てる C++ プログラミング言語の関数です。 変数、配列、およびその他のデータ構造に動的メモリを割り当てるために使用されます。
malloc()
関数は 3つの引数を取ります:
- 最初の引数は、割り当てるバイト数を指定します。
- 2 番目の引数は、割り当てるデータのタイプを指定します。
- 3 番目の引数は、割り当てられたデータを格納するアドレスです。
free()
関数
C++ の free()
関数は、malloc()
演算子を使用して以前に割り当てられたメモリ領域を解放または解放します。 後で再利用できるように、このメモリ領域をシステムに返します。
realloc()
関数
realloc() はメモリブロックのサイズを変更できる関数です。 割り当てのサイズを変更するために使用されます。通常、使い果たされたときに割り当てを拡大します。
realloc()
は 3つのパラメータを取ります: 古い割り当てへのポインタ、新しい割り当てへの情報、新しい割り当ての新しいサイズです。
古いポインタは、再割り当て前に割り当てられた元のメモリ ブロックを指し、新しい情報は、再割り当て後に新しく割り当てられたメモリを意味します。 新しいサイズは、このブロックの長さをバイト単位で設定するか、このパラメーターが指定されていない場合はアイテムの数を設定することにより、このブロックに割り当てる必要があるスペースの量を指定します。
標準ライブラリを使用した動的メモリ割り当ての利点
このライブラリは、次のような動的メモリを管理するためのいくつかのタイプの関数を提供します。
- ヒープ上のメモリ ブロックの割り当てと解放。
- 割り当てられたメモリのブロック間でデータをコピーする。
- 実行時に割り当てられたメモリ ブロックのサイズにアクセスする。
- 割り当てられたメモリのブロックが空かどうかを確認します。 と
- ヒープ内のすべてのブロックを一度に解放します。
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook