2011-10-26 7 views
3

free()を使用して行列配列全体をメモリから削除したいと考えています。どうすればいいですか?free()の2D配列Cでのmallocの使用

配列を割り当てます。

// test.h 
#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 

#define BYTE unsigned char 
#define my_array(n_height, n_width) (BYTE **)create_array(sizeof(BYTE), (n_height), (n_width)) 

char **create_array(int u_size, int height, int width); 
char **create_array(int u_size, int height, int width) 
{ 
    char **array; 
    int  i; 

    if (!(array=(char **)malloc(height*sizeof(char *)))) { 
     printf("Memory allocation error.\n"); 
     exit(0); 
    } 
    if (!(array[0]=(char *)malloc(height*width*u_size))) { 
     printf("Memory allocation error.\n"); 
     exit(0); 
    } 
    for (i=1; i<height; i++) 
     array[i] = array[i-1] + width*u_size; 
    return array; 
} 

// test.c 
#include "array.h" 
int main() 
{ 
    unsigned char *bytes; 
    BYTE **matrix; 
    matrix = my_array(height, width); 

    int c = 0; 
    for (int h=0; h < height; h++) { 
     for (int w=0; w < (width); w++) { 
      matrix[h][w] = bytes[c]; 
      c++; 
     } 
    } 

    printf("Done.\n"); 

    free(matrix); // really empty memory?? 
} 

私は私が(行列)の自由を使用する場合、マトリックスは完全にメモリから削除されたかどうかを確認していません。

答えて

5

malloc()には、1回のコールで1回、free()に電話する必要があります。 free()を無料にすることはできません:いくつかのブロック。 free()に一度しか電話をしたくない場合は、malloc()への1回のコールで、必要なメモリをすべて割り当てる必要があります。

+0

空き(行列[0]); 空き(行列); はうまくいくはずですか? – wowofe

+0

@wowofe wowofe:はい。 – caf

+0

@unwind&caf:ありがとう! – wowofe

1

好きな人は、美しいC99のポインターと可変長の配列を使用できます。

は次のように割り当てます。

char (*arr)[width] = emalloc(width*height); 

インデックス、次のように:このような

arr[23][10] = 2; //row 23, column 10 

とフリー:

free(arr); 
+0

emalloc()とは何ですか? –

+0

@デイブ:あなたの方法を試してみます。ありがとうございました! – wowofe

+0

@Alex 'emalloc()'は、有効なポインタを返すか、エラーを出力して終了する 'malloc()'のPlan9の全面で使用される名前です。 – Dave

0

あなたはメモリが解放されていることを確認したい場合は、 Valgrindプログラムを使用する必要があります。あなたは2 malloc秒を持っているので、あなたは2 free秒を必要とする

free(matrix[0]); 
free(matrix); 
+0

これはまさに私が質問を投稿する前に使ったコードです。行 - > free(matrix [i])でエラーが発生したため、わからなかった。 :テスト(830,0x7fff73cd4960)malloc:***エラー***117439a4c:解放されたポインタが割り当てられませんでした ***デバッグするmalloc_error_breakにブレークポイントを設定しました (gdb) – wowofe

+0

これは正しいので、 2度も自由にしなければならない。 valgrindプログラムを使用することをお勧めします。これは素晴らしいツールです。 – vicentazo

+0

あなたのヒントありがとう!私は今それを得ました:for(int i = 0; i wowofe

2


はこの場合The Valgrind Quick Start Guide

を参照してください、これを試してみてください。しかし、割り当てを並べ替えると少し最適化できます。

/... 
void* mcontent; 
if (!(mcontent = malloc(height*sizeof(char*) + height*width*u_size))) { 
    printf("Memory allocation error.\n"); 
    exit(0); 
} 
array = (char **)mcontent; 
array[0]=(char *)(mcontent + height*sizeof(char*)); 

これには2つの利点があります。まず、使いやすさ:作成した方法を邪魔することなく、行列 "オブジェクト"を解放するだけです。第二に、効率性:あなたは地域性と一つの割り当てしか持たず、どちらも速度を意味します。

+0

ありがとうございました!あなたのコードは私が前にメモリを解放するためにループ内で苦労していたので、free()を使う方法を理解することは私には明らかです。分かりました。 – wowofe

+0

動的メモリ割り当てに失敗した場合は、 'exit(EXIT_FAILURE);や' exit(1); 'を使わないでください。 – Ultimater