'delete' によるメモリの解放
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 7/56。
new を使用してメモリを動的に割り当てると、そのメモリは使い終わっても自動的には消滅しません。自動的にクリーンアップされる通常の変数とは異なり、動的に割り当てられたメモリは、明示的に解放するまで使用され続けます。ここで delete キーワードが不可欠になります。
deleteキーワードは、以前にnewで割り当てられたメモリを解放します。deleteを使用すると、そのメモリの使用が終了したことをシステムに伝え、他の目的に再利用できるようにします。
int* ptr = new int(42); // メモリを割り当てる
// メモリを使用する...
delete ptr; // メモリを解放する動的メモリ管理の基本原則は単純です:すべての new に対して、対応する delete が存在しなければなりません。動的に割り当てられたメモリを削除し忘れると、メモリリークが発生します。つまり、プログラムは使用しなくなったメモリを保持し続け、最終的にはシステムの空きメモリが不足する原因となります。
ポインタに対して delete を呼び出した後、そのポインタは無効になり、二度と使用すべきではありません。誤って使用するのを避けるために、削除後にポインタを nullptr に設定することは良い習慣です。
チャレンジ
簡単new を使用してメモリを割り当て、それを使用し、その後 delete を使用して適切に解放することで、動的メモリの完全なライフサイクルを実証するプログラムを作成してください。
以下の入力が提供されます:
- 動的に割り当てられたメモリに格納する1つ目の整数値
- 格納された値を更新するための2つ目の整数値
プログラムは以下の手順を実行する必要があります:
newを使用して整数のメモリを動的に割り当て、そのポインタをdynamicPtrという名前の変数に格納します- 間接参照演算子を使用して、最初の入力値を動的に割り当てられたメモリに代入します
- 動的に割り当てられたメモリに格納されている初期値を表示します
- 動的に割り当てられたメモリの値を2番目の入力値に更新します
- 更新された値を表示します
deleteを使用して動的に割り当てられたメモリを解放します- 削除後、ポインタを
nullptrに設定します - メモリが解放されたことを示す確認メッセージを表示します
以下の正確な出力形式を使用してください:
Initial value: [first value]
Updated value: [second value]
Memory freed successfullyチートシート
delete キーワードは、以前に new で割り当てられたメモリを解放します:
int* ptr = new int(42); // メモリを割り当てる
// メモリを使用する...
delete ptr; // メモリを解放するメモリリークを避けるために、すべての new に対して、対応する delete が存在しなければなりません。
delete を呼び出した後は、誤って無効なメモリを使用することを避けるために、ポインタを nullptr に設定します:
delete ptr;
ptr = nullptr;自分で試してみよう
#include <iostream>
using namespace std;
int main() {
// 入力値を読み込む
int firstValue, secondValue;
cin >> firstValue;
cin >> secondValue;
// TODO: 以下にコードを記述してください
// 1. newを使用してメモリを割り当て、dynamicPtrに格納する
// 2. 割り当てられたメモリにfirstValueを代入する
// 3. 初期値を出力する
// 4. secondValueで更新する
// 5. 更新された値を出力する
// 6. メモリを解放し、ポインタをnullptrに設定する
// 7. 確認メッセージを出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。