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

C++のdelete演算子とfree()関数の違いと正しい使い方

このチュートリアルでは、C++におけるdelete演算子free()関数について詳しく解説します。

どちらの機能も主な目的は共通しています。それは、不要になったメモリを解放することです。ただし、両者には明確な役割の違いがあります。

  • delete演算子 ... new演算子で動的に確保したメモリを解放する
  • free()関数 ... malloc()関数で動的に確保したメモリを解放する

この対応関係を誤ると、プログラムがクラッシュするなどの未定義動作を引き起こす恐れがあるため、注意が必要です。

サンプルコード

#include<stdio.h>
#include<stdlib.h>
int main(){
    int x;
    int *ptr1 = &x;
    int *ptr2 = (int *)malloc(sizeof(int));
    int *ptr3 = new int;
    int *ptr4 = NULL;
    //deleteの誤った使用例
    delete ptr1;
    delete ptr2;
    //deleteの正しい使用例
    delete ptr3;
    delete ptr4;
    getchar();
    return 0;
}

コードの解説

このプログラムでは、4種類のポインタを用意し、delete演算子の正しい使い方と誤った使い方を比較しています。

誤った使用例

  • delete ptr1 ... ptr1はスタック上のローカル変数xのアドレスを指しています。newで確保されたメモリではないため、deleteで解放することはできません。
  • delete ptr2 ... ptr2が指すメモリはmalloc()で確保されたものです。newとdeleteのペアに該当しないため、deleteで解放すると未定義動作となります。この場合はfree()を使用すべきです。

正しい使用例

  • delete ptr3 ... new演算子で確保したメモリをdeleteで解放しています。正しい組み合わせです。
  • delete ptr4 ... NULLポインタに対するdeleteは安全であり、何も行わないことが言語仕様で保証されています。

まとめ

メモリ解放の基本ルールは「newにはdelete、mallocにはfree」です。このペアを正しく守ることで、メモリリークや未定義動作を防ぎ、安全で安定したC++プログラムを書くことができます。

  1. C++で解くドミノとトロミノを使ったタイル敷き詰め問題(2×Nボード)

    問題の概要本記事では、「ドミノ」と「トロミノ」という2種類の形状を使ったタイル敷き詰め(タイリング)問題をC++で解く方法を解説します。これらのピースは、以下のように回転させて使用することができます。タイリングでは、盤面上のすべてのマスを必ずタイルで覆わなければなりません。また、2つのタイリング方法は、盤上の4方向に隣接する2つのセルにおいて、片方のタイリングだけがその両方のマスを同じタイルで占有している場合に限り「異なる」とみなされます。入力と出力の例整数Nが与えられたとき、2×Nのボードを敷き詰める方法が何通りあるかを求めます。例えば、入力が3の場合、出力は5となります。敷き詰め方は以下の

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

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