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

C/C++のメモリリークとは?仕組みと具体例をわかりやすく解説

メモリリーク(memory leak)とは、プログラマが動的に確保したメモリを適切に解放(free / delete)せずに放置してしまうことで発生する現象です。確保されたメモリは、すでにプログラムから使われていないにもかかわらず、システム上では「使用中」として予約されたまま残ります。このように、何の理由もなくメモリ領域が占有され続ける状態が、メモリリークと呼ばれる所以です。

メモリリークが起きると、一部のメモリブロックが無駄に消費されます。システムに十分な空きメモリがある場合でも、リークが蓄積すればパフォーマンスの低下を招き、最悪の場合はメモリ枯渇によるクラッシュにつながることもあります。

例1:new したポインタを delete しないケース

void my_func() {
    int *data = new int;
    *data = 50;
}

このコードの問題点は、new で確保した *data が関数の終了時に delete されていないことです。その結果、確保されたメモリはどこからも参照できなくなり、そのまま無駄になってしまいます。これが典型的なメモリリークです。

例2:malloc / free を使うC言語のケース

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *data = (int *)malloc(sizeof(int));
    if (data == NULL) {
        return 1;
    }
    *data = 50;
    printf("value = %d\n", *data);
    free(data);   /* 解放しないとメモリリークになる */
    data = NULL;
    printf("Done\n");
    return 0;
}

出力

value = 50
Done

free() の呼び出しを忘れると、main() 関数が終了しても確保したメモリは解放されず、リークとして残り続けます。

メモリリークへの対策

  • 確保と解放を必ず対にするnew / malloc には対応する delete / free を必ず呼びます。
  • スマートポインタを活用する:C++では std::unique_ptrstd::shared_ptr など RAII の仕組みを使えば、スコープを抜けた際に自動的に解放されます。
  • 検出ツールを利用する:Valgrind や AddressSanitizer などのツールを使えば、リーク箇所を効率的に特定できます。
  1. C/C++の型キャストとは?基礎から整数昇格・通常の算術型変換まで解説

    型キャスト(型変換)とは、あるデータ型の変数を別のデータ型へ変換する手法のことです。例えば、long型の値を単純なint型の変数に格納したい場合、longをintへキャストすることができます。値をある型から別の型へ明示的に変換するには、キャスト演算子を次の形式で使用します。(型名) 式キャスト演算子の使用例次の例では、キャスト演算子によって整数変数同士の除算が浮動小数点演算として実行されます。#include <stdio.h> main() { int sum = 17, count = 5; double mean; mean = (double) su

  2. メモリリークとは?原因と効果的な対策・予防方法を徹底解説

    メモリリークとは、アプリケーションが確保したメモリ(リソース)を使用後にシステムへ返却せず、解放されないまま残ってしまう現象のことです。その結果、タスクマネージャー上でメモリ使用量が増加し続け、PC全体のパフォーマンスが低下します。この問題は、PCに搭載されているRAM容量が不足しており、必要なメモリ量が搭載容量を大きく上回っている場合に発生しやすい傾向があります。この症状は、PCにおける高CPU使用率の問題とよく似ています。原因が複数考えられるように、対策も複数存在します。幸い、メモリリークは高CPU使用率ほど深刻な問題ではなく、複数の方法で解決できます。PCの再起動、特定アプリの終了、不要