メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

リソース リーク

FILE ポインターのスコープが終了したか、ポインターが再度割り当てられていないと、ファイル ストリームは閉じない

説明

この欠陥は、FILE ポインターを使用してファイル ストリームを開いたが、閉じる前に以下の処理を行った場合に発生します。

  • ポインターのスコープの終了。

  • 別のストリームへのポインターの割り当て。

リスク

ファイル ハンドルを明示的に、できるだけ早期に解放しないと、リソースが使い果たされることによりエラーが発生することがあります。

修正方法

FILE ポインターを、そのスコープの終了前か、そのポインターを別のストリームに割り当てる前に閉じます。

すべて展開する

#include <stdio.h>

void func1( void ) {
    FILE *fp1;
    fp1 = fopen ( "data1.txt", "w" );
    fprintf ( fp1, "*" );

    fp1 = fopen ( "data2.txt", "w" );
    fprintf ( fp1, "!" );
    fclose ( fp1 );
}

この例では、ファイル ポインター fp1 がファイル data1.txt を指しています。fp1 は、data1.txt のファイル ストリームから明示的に分離される前に、別のファイル data2.txt へのアクセスに使用されています。

修正 — FILE ポインターを解放

1 つの修正方法として、fp1data1.txt のファイル ストリームから明示的に分離します。

#include <stdio.h>

void func1( void ) {
    FILE *fp1;
    fp1 = fopen ( "data1.txt", "w" );
    fprintf ( fp1, "*" );
    fclose(fp1);

    fp1 = fopen ( "data2.txt", "w" );                  
    fprintf ( fp1, "!" );
    fclose ( fp1 );
}

結果情報

グループ: リソース管理
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: RESOURCE_LEAK
影響度: High

バージョン履歴

R2015b で導入

すべて展開する