C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のdelete演算子とは?動的メモリ解放の基本と使い方を解説

delete演算子は、new演算子によって動的に確保されたメモリを解放するために使用されます。プログラマはこのdelete演算子を使うことで、不要になったポインタ変数が指すメモリ領域を明示的に解放し、メモリリークを防ぐことができます。

delete演算子の基本構文

C++におけるdelete演算子の基本的な構文は以下の通りです。

delete pointer_variable;

また、配列として確保したメモリブロックを解放する場合は、次のように角括弧 [ ] を付けて記述します。

delete[] pointer_variable;

それでは、C++でのdelete演算子の具体的な使用例を見ていきましょう。

サンプルコード

#include <iostream>
using namespace std;
int main () {
    int *ptr1 = NULL;
    ptr1 = new int;
    float *ptr2 = new float(299.121);
    int *ptr3 = new int[28];
    *ptr1 = 28;
    cout << "Value of pointer variable 1 : " << *ptr1 << endl;
    cout << "Value of pointer variable 2 : " << *ptr2 << endl;
    if (!ptr3)
        cout << "Allocation of memory failed\n";
    else {
        for (int i = 10; i < 15; i++)
            ptr3[i] = i+1;
        cout << "Value of store in block of memory: ";
        for (int i = 10; i < 15; i++)
            cout << ptr3[i] << " ";
    }
    delete ptr1;
    delete ptr2;
    delete[] ptr3;
    return 0;
}

実行結果

Value of pointer variable 1 : 28
Value of pointer variable 2 : 299.121
Value of store in block of memory: 11 12 13 14 15

プログラムの解説

上記のプログラムでは、以下のような流れでメモリの確保と解放を行っています。

  • ptr1:NULLで初期化した後、new intでint型1つ分のメモリを確保し、値28を代入しています。
  • ptr2new float(299.121)のように初期値を指定してfloat型のメモリを確保しています。
  • ptr3new int[28]でint型28個分の配列用メモリブロックを確保しています。

ptr3のメモリ確保に失敗した場合(nullptrが返された場合)は「Allocation of memory failed」というエラーメッセージを表示し、成功した場合はインデックス10〜14に値を格納して出力します。

最後に、delete ptr1delete ptr2で単一オブジェクトとして確保したメモリを解放し、delete[] ptr3で配列として確保したメモリブロックを解放しています。

delete演算子使用時の注意点

  • newとdeleteの対応を正しく取るnewで確保したものはdeleteで、new[]で確保したものはdelete[]で解放します。対応を間違えると未定義動作を引き起こす可能性があります。
  • 二重解放を避ける:同じポインタに対して2回deleteを実行すると、プログラムがクラッシュする原因になります。
  • 解放後はnullptrを代入する:delete後のポインタはダングリングポインタ(無効なメモリを指すポインタ)となるため、ptr = nullptr;としておくと安全性が高まります。

このように、delete演算子を適切に使うことで、動的に確保したメモリを効率的に管理し、安定したC++プログラムを作成することができます。

  1. C++でツリーノードを削除する:合計値が0の部分木を除去するアルゴリズム

    問題概要根がノード0であるような木構造を考えます。この木には、次の情報が与えられています。ノードの総数:nodesi番目のノードの値:value[i]i番目のノードの親:parent[i]求めたいのは、「ノードの値の合計が0になる部分木」をすべて削除した後、木に残っているノードの個数です。たとえば、下図のような木を考えてみましょう。ノードは全部で7つありますが、出力は2になります。これは、値が0であるノード3を根とする部分木と、ノード2を根とする部分木(4 + (-2) + (-1) + (-1) = 0)が削除対象となり、最終的に残るのがノード0とノード1だけだからです。解法の考え方この問題

  2. C++で二分探索木(BST)からノードを削除する方法

    二分探索木(BST:Binary Search Tree)が与えられます。ここで1つのキー k を受け取り、そのキー k をBSTから削除して、更新されたBSTを返すことを考えます。 例えば、次のような木があるとします。 そして、削除するキーが k = 3 の場合、出力される木は次のようになります。 アルゴリズムの考え方 この問題を解くために、まず「ルートノードを削除する」処理を担当する補助メソッド deleteRoot() を定義します。このメソッドは以下のように動作します。 root が null の場合は、null を返します。 root に右部分木が存在しない場合は、roo