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

C++のdelete演算子とfree()関数の違いと使い方を徹底解説

C++やC言語で動的に確保したメモリを解放する方法として、主にdelete演算子free()関数の2つがあります。本記事では、それぞれの構文、使い方、そして実際のコード例を通して、両者の違いをわかりやすく解説します。


delete演算子とは

delete演算子は、new演算子によって動的に確保されたメモリを解放するために使用されます。プログラマは、この演算子を使って自分で作成したポインタ変数が指すメモリを自由に解放できます。

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

delete ポインタ変数名;

また、new[]で確保した配列形式のメモリブロックを解放する場合は、次の構文を使用します。

delete[] ポインタ変数名;

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、ptr2、ptr3という3つのポインタ変数を宣言しています。ptr1とptr2はnew演算子を使って値を初期化し、ptr3はnew演算子によって確保されたメモリブロックを格納しています。

int *ptr1 = NULL;
ptr1 = new int;
float *ptr2 = new float(299.121);
int *ptr3 = new int[28];
*ptr1 = 28;

配列の各要素に値を代入し、その内容を画面に出力しています。プログラムの最後では、確保したメモリを解放するために、delete ptr1、delete ptr2、そして配列用のdelete[] ptr3を使用しています。

delete ptr1;
delete ptr2;
delete[] ptr3;

注意点:newで確保したメモリはdeleteで、new[]で確保したメモリはdelete[]で解放する必要があります。これを混同すると未定義動作を引き起こす可能性があるため注意しましょう。

free()関数とは

free()関数は、malloc()関数によって動的に確保されたメモリを解放するために使用されるC言語の標準ライブラリ関数です。なお、free()を呼び出してもポインタ変数自体の値は変化しないため、ポインタは引き続き同じメモリ位置を指し続ける点に注意が必要です(いわゆるダングリングポインタ状態になります)。

C言語におけるfree()関数の構文は以下の通りです。

void free(void *pointer_name);

pointer_name − 解放対象のメモリを指すポインタの名前です。

free()関数の使用例

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n = 4, i, *p, s = 0;
    p = (int*) malloc(n * sizeof(int));
    if(p == NULL) {
        printf("\nError! memory not allocated.");
        exit(0);
    }
    printf("\nEnter elements of array : ");
    for(i = 0; i < n; ++i) {
        scanf("%d", p + i);
        s += *(p + i);
    }
    printf("\nSum : %d", s);
    free(p);
    return 0;
}

実行結果

Enter elements of array : 32 23 21 28
Sum : 104

プログラムの解説

上記のプログラムでは、4つの変数を宣言しており、そのうちの1つがポインタ変数*pです。このポインタは、malloc()によって確保されたメモリ領域を格納しています。

int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));

ユーザーが入力した配列の各要素の合計値を計算して出力します。最後に、確保したメモリを解放するために以下のコードを実行しています。

free(p);

deleteとfree()の主な違い

両者の主な違いをまとめると以下のようになります。

delete演算子(C++):new演算子で確保したメモリを解放します。オブジェクトのデストラクタを自動的に呼び出すため、クラスオブジェクトの解放に適しています。

free()関数(C言語):malloc()、calloc()、realloc()で確保したメモリを解放します。デストラクタは呼び出されないため、C++のオブジェクトには使用すべきではありません。

C++プログラミングではnew/deleteのペアを、C言語ではmalloc()/free()のペアを対応させて使用することが重要です。混用するとメモリ破壊やクラッシュなどの深刻なバグにつながる可能性があります。

  1. 【C/C++】new/deleteとmalloc/freeの違いを徹底解説!メモリ管理の基本

    C/C++には、実行時にメモリを動的に確保・解放するための仕組みとして、C++のnew/delete演算子と、C言語由来のmalloc()/free()関数があります。どちらもヒープ領域を扱う点は共通していますが、性質や使い方には重要な違いがあります。本記事では、それぞれの基本的な使い方をサンプルコードとともに紹介し、最後に両者の主な相違点を比較表で整理します。 new / delete(C++) new演算子は、ヒープ領域へのメモリ割り当てを要求します。十分な空きメモリが存在すれば、確保したメモリを初期化してポインタ変数に結び付け、そのアドレスを返します。 delete演算子は、newで確

  2. C++のnew/delete演算子を解説!動的メモリ確保と解放の基本

    new演算子とは new演算子は、ヒープ領域に対してメモリの割り当てを要求します。十分な空きメモリが存在する場合、確保したメモリをポインタ変数に結び付け、そのアドレスを返します。 基本構文 pointer_variable = new datatype; 初期値を指定して確保する構文 メモリ確保と同時に初期値を設定することも可能です。 pointer_variable = new datatype(value); メモリブロック(配列)を確保する構文 pointer_variable = new datatype[size]; new演算子のサンプルコード 次の例では、単一の変数用のメモリ、