mallocとfreeについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Flime

mallocとfreeについて

#1

投稿記事 by Flime » 15年前

char ***f;

	f=(char ***)malloc(sizeof(char **)*13);
	for(i=0;i<13;i++){
		f=(char **)malloc(sizeof(char *)*13);
	}
	for(i=0;i<13;i++){
		for(j=0;j<13;j++){
			f[j]=(char *)malloc(sizeof(char)*3);
		}
	}



このようにmallocしたメモリをfreeしたいのですが、

for(i=0;i<13;i++){
		for(j=0;j<13;j++){
			free(f[j]);
		}
	}
	for(i=0;i<13;i++){
		free(f);
	}
	free(f);



これで正しいでしょうか?
エラーとかはなにも出ないのですが、正しくできているか不安です。

御津凪

Re:mallocとfreeについて

#2

投稿記事 by 御津凪 » 15年前

見たところ、一応正しく確保・開放されているようです。

もし、使用しているコンパイラが VC2005 以降のものであれば、
下記のデバッグ用関数を使用した方法で正しく行なわれているか確認することができます。
#include <crtdbg.h> // _CrtSetDbgFlag を使用するのに必要

int main( void ){
    // プログラムの最初にデバッグフラグをセットする
    _CrtSetDbgFlag(
        _CRTDBG_CHECK_ALWAYS_DF | // メモリ確保時・開放時に整合性を毎回チェック
        _CRTDBG_LEAK_CHECK_DF     // プログラム終了時に開放されていないメモリをダンプ出力する
        );

    // 特定の処理

    return 0;
}
これでプログラム終了時、出力ウインドウにいつもどおりの出力だったら問題がないことを示します。
何かしら見慣れない出力がされていれば、そのプログラムには問題があることになります。
もし、メモリリークしていれば、その個数分だけダンプ情報が出力されます。


ちなみに、後で realloc でサイズが変更されないのであれば、
一回の malloc で質問にあるコードどおりの3次元文字配列を確保することが出来ます。
開放はその確保した一つだけを free するだけで簡単なのですが、
一括確保したメモリを3次元文字配列に構築するのが少々面倒です。


# あと、 i の for 文は一度回すだけで処理できるはずですよ。

Flime

Re:mallocとfreeについて

#3

投稿記事 by Flime » 15年前

そういえば開発環境を何も書きませんでしたね…すいません。
VC2008です。

デバッグ用関数があるなんて知りませんでした。
役立てようと思います。

丁寧にありがとうございました。


iのfor文は盲点でした(^^;)

閉鎖

“C言語何でも質問掲示板” へ戻る