C++において、メモリの動的確保と解放は非常に重要な機能です。
その中でもnew
delete
は、C++におけるメモリの動的確保に必須のスキルです。
そこで本記事では、C++のnew deleteの基本的な使い方から応用的な使い方まで詳しく解説します。
new deleteとは
new
delete
は、C++において動的メモリの確保と解放を行うための演算子です。
静的なメモリ確保である配列や変数とは異なり、プログラム実行中に必要な分だけメモリを確保することができます。また、不要になったメモリを解放することもできます。
new演算子は、指定された型のオブジェクトを動的に生成し、そのオブジェクトへのポインタを返します。delete演算子は、new演算子で確保したメモリ領域を解放します。
例えば、以下のようにしてint型の変数を動的に生成することができます。
int* p = new int;
この場合、int型のサイズ分だけメモリが確保され、そのアドレスがpに格納されます。この領域はdelete演算子で解放することができます。
delete p;
new
delete
はC言語のmalloc
free
よりも安全かつ使いやすく、C++ではmalloc
free
の代わりに使用されています。
しかし、誤った使い方をするとプログラム実行時にエラーやメモリリークが発生する可能性があるため注意が必要です。
new deleteの基本的な使い方
C++において、new演算子とdelete演算子は動的なメモリ割り当てを行うために使用されます。
new演算子は、指定された型のオブジェクトを動的に割り当てることができます。
一方、delete演算子は、new演算子で割り当てられたメモリを解放することができます。
単一のオブジェクトの動的な割り当て
単一のオブジェクトを動的に割り当てる場合、以下のように記述します。
int* p = new int;
この例では、int型の変数を指すポインタpが宣言され、new演算子によってint型のサイズ分だけメモリが割り当てられます。この時点ではまだ初期化されていないため、pが指すアドレスに対して値を代入する必要があります。
*p = 10;
これでpが指すアドレスに10が代入されました。この後は通常の変数と同様に扱えます。
配列の動的な割り当て
配列を動的に割り当てる場合も同様です。以下はint型の配列を5つ分動的に割り当てる例です。
int* p = new int[5];
この場合も先ほどと同様に初期化する必要があります。
for (int i = 0; i < 5; i++) {
p[i] = i;
}
これでp[0]
からp[4]
まで順番に0
から4
まで代入されました。
オブジェクトの動的な割り当てと初期化
オブジェクトを動的に割り当てる場合も同様です。以下はstringクラスのオブジェクトを1つ分動的に割り当てる例です。
//初期化時に引数を持つコンストラクタを呼べる
string* p = new string("hello");
初期化した後は通常のstringクラスと同じように扱えます。
cout << *p << endl; // "hello" と表示される
オブジェクトの動的な割り当てとデストラクタの呼び出し
new演算子でオブジェクトを生成した場合、そのオブジェクトは明示的なdelete演算子呼び出しまたはプログラム終了時まで存続します。
delete演算子でオブジェクトを破棄することによって、予め定義されたデストラクタを呼び出して、破棄する直前に行う処理を実行することが可能です。
以下はMyClassクラスのオブジェクトを1つ生成し、明示的なdelete演算子呼び出し後でもデストラクタが正しく呼ばれるか確認する例です。
class MyClass {
public:
MyClass() { cout << "MyClass constructor called" << endl; }
~MyClass() { cout << "MyClass destructor called" << endl; }
};
int main() {
MyClass* p = new MyClass();
delete p;
}
実行結果:
MyClass constructor called
MyClass destructor called
以上がC++でnew
delete
演算子を使った簡単なメモリ管理方法です。