• ベストアンサー
  • 困ってます

メモリの解放free()について

メモリ解放についての質問です。 下の関数をループで呼び出すとき、new_itemのメモリ解放free()はどのように行えば良いでしょうか? typedef struct _ITEM { int n,m; void *right; } item; int data() { int i,j,k; int n,m; item *new_item,*last_item; for (i = 0; i <= M-1; i++) { ... last_item = &(list[i]); k = 0; for (j = 0; j <= num-1; j++) { /* making new item */ if ((new_item = (item*)malloc(sizeof(item))) == NULL) { fprintf(stderr,"Can't allocate memory.\n"); exit(-1); } new_item->m = i; new_item->n = k; new_item->right = NULL; last_item->right = new_item; last_item = new_item; } } }

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数286
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.4
  • circuit
  • ベストアンサー率72% (13/18)

このタイプのリストだと、自分の右側しか見えないので、最初の要素を知っておく必要があります。 最初の要素から、順に右へ右へ解放していくのが通常の手段です。 最初の要素をダミーとして作っておきます。 // グローバル変数 item * first = NULL; // int data() { int i,j,k; int n,m; item *new_item,*last_item; first = (item *)malloc(sizeof(item)); first->right = NULL; last_item = first; for (i = 0; i <= M-1; i++) { ... //last_item = &(list[i]); k = 0; for (j = 0; j <= num-1; j++) { /* making new item */ if ((new_item = (item*)malloc(sizeof(item))) == NULL) { fprintf(stderr,"Can't allocate memory.\n"); exit(-1); } new_item->m = i; new_item->n = k; new_item->right = NULL; last_item->right = new_item; last_item = new_item; } } } // 解放部分 item * tmp; while( first != NULL ) { tmp = first->right; free(first); first = tmp; } @補足 list 配列が何かわからないので無視しました。 もしなんらかの実装がされているなら、それにあわせて考え直す必要があります。 #些細なことですが、right はリスト構造であることを示すためにも struct _ITEM * 型で定義したほうがいいと思います。 #void * にすると何のポインタが入るのかわからないので、可読性が落ちます。

参考URL:
http://www.geocities.jp/ky_webid/algorithm/010.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

無事解決いたしました。 先頭アドレスはa->start_row_listが全部持ってました。 回答していただきありがとうございました。

質問者からの補足

皆さんの意見を参考に色々修正して試してみてはいるのですが、なぜかメモリが解放されません。 色々試してみて(for文外にだしたりして)new_item以外は解放されていることを確認しましたので、やはりnew_itemが解放されていないんだと思います。 大変長々書いて申し訳ないですが、もしお暇でしたら見ていただると幸いです。 typedef struct _ITEM { int nn,mm; struct _ITEM *right; } item; typedef struct _SPMATRIX { int N; int M; int* num_ones_in_col; int* num_ones_in_row; int biggest_num_ones_col; int biggest_num_ones_row; item* start_col_list; item* start_row_list; } sparce_matrix; item *first = NULL; int gaussian(FILE* fp, sparce_matrix* a) { int i,j,k,w,tmp; int nn,mm; item *new_item, *last_item; item* p; int* current_row; int leader, eleader; item *del; fscanf(fp,"%d %d\n",&(a->N),&(a->M));  if ((current_row = (int*)malloc(sizeof(int)*(a->N))) == NULL) { fprintf(stderr,"Can't allocate memory\n"); exit(-1); } if ((a->num_ones_in_row = (int*)malloc(sizeof(int)*(a->M))) == NULL) { fprintf(stderr,"Can't allocate memory\n"); exit(-1); } if ((a->num_ones_in_col = (int*)malloc(sizeof(int)*(a->N))) == NULL) { fprintf(stderr,"Can't allocate memory\n"); exit(-1); } if ((a->start_row_list = (item*)malloc(sizeof(item)*(a->M))) == NULL) { fprintf(stderr,"Can't allocate memory\n"); exit(-1); } first = (item *)malloc(sizeof(item)); first->right = NULL; last_item = first; for (i = 0; i <= a->M-1; i++) { //略 last_item = &(a->start_row_list[i]); k = 0; for (j = 0; j <= a->num_ones_in_row[i]-1; j++) { while ((current_row[k] == 0) && (k <= a->N-1)) k++; if ((new_item = (item*)malloc(sizeof(item))) == NULL) { fprintf(stderr,"Can't allocate memory\n"); exit(-1); } new_item->mm = i; new_item->nn = k; new_item->right = NULL; last_item->right = new_item; last_item = new_item; k++; } } free(current_row); while( first != NULL ) { del = first->right; free(first); first = del; } free(a->num_ones_in_row); free(a->num_ones_in_col); free(a->start_row_list); return 0; }

関連するQ&A

  • メモリの解放free

    double **w; int no;    | if((w = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error1"); exit(1); }    |  データ格納処理    | free(w); のようなプログラムの中で、 データ格納処理の途中でSegmentation faultで 落ちてしまいました。この場合、freeが実行されなくても メモリは解放してくれるのでしょうか? また、mallocでメモリ確保できたはずなのに 存在するはずの場所にデータを格納できない原因として 考えられるものはなんでしょうか? ちなみに、落ちる場所が実行の度に変わっているようで、 同じ条件なのにデータの格納数が違っています。

  • 多次元配列のメモリ解放

    多次元配列のメモリ解放についてです。 以下のような方法で多次元配列を確保した場合に、 --- char** ppMain; ppMain = new char*[3]; for (int i = 0; i < 3; i++){ ppMain[i] = new char[20]; } --- メモリ解放する場合、 --- for (int i = 0; i < 3; i++){ delete [] ppMain[i]; ppMain[i] = NULL; } delete [] ppMain; ppMain = NULL; --- で良いでしょうか? おそらく、new/deleteの回数が同じであれば問題ないと思うのですが。 少し混乱してしまって、 delete [] ppMain[i]; によって new char*[3]で確保したところも解放されており delete [] ppMain; が必要なく危険な領域まで解放しようとしているということはないでしょうか? ご専門、お詳しいかたコメント宜しくお願いします。

  • 多次元配列の new 2

    追加の質問ですみません^^; char の8個の配列へのポインタの配列を new する場合などは、以下のサンプルのように typedef しないとかけないんでしょうかね?たとえば、  char (**bb)[8] = new (char (*)[8])[8]; 書きたいように思いますが、これは文法違反ですし・・・^^; ==== サンプル:(iostream の初期化時に、定義した new が呼び出されるかもしれないことを一応考慮して、stdio の関数を使っています^^) #include <new> #include <stdlib.h> #include <stdio.h> void *operator new(std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new(): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete(void *p) { fprintf(stderr, "::delete(): %p\n", p); if (p) free(p); } void *operator new[](std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new[](): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete[](void *p) { fprintf(stderr, "::delete[](): %p\n", p); if (p) free(p); } int main() { typedef char (*T)[8]; char (**b)[8] = new T[8]; delete[] b; } ==== % ./a.exe ::new[](): 0x6e01b0 32 ::delete[](): 0x6e01b0

その他の回答 (4)

  • 回答No.5
noname#20242

circuitさんの意見とダブるかもしれませんが、#1の考えで全部開放できると思いますよ。 オリジナルに多少手を加えてしまいましたが、以下のコードでどうでしょうか? #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct _ITEM { int n,m; struct _ITEM *right; } item; #define M 2 #define num 3 item **list; item **top; int data(void) { int i,j,k; int n,m; item *new_item,*last_item; for (i = 0; i <= M-1; i++) { last_item = list[i]; k = 0; for (j = 0; j <= num-1; j++) { /* making new item */ if ((new_item = (item*)malloc(sizeof(item))) == NULL) { fprintf(stderr,"Can't allocate memory.\n"); exit(-1); } k = j; new_item->m = i; new_item->n = k; new_item->right = NULL; if (top[i] == NULL) { top[i] = new_item; }else{ last_item->right = new_item; } last_item = new_item; } } return 0; } int main(int argc, char* argv[]) { int i, size; item *top_item, *del_item; size = sizeof(void*) * M; list = (item**)malloc(size); top = (item**)malloc(size); memset(list, '\0', size); memset(top, '\0', size); data(); //free for (i = 0; i < M; i++) { top_item = top[i]; while (top_item != NULL) { del_item = top_item; top_item = top_item->right; free(del_item); } } free(list); free(top); return 0; }

共感・感謝の気持ちを伝えよう!

質問者からのお礼

無事解決いたしました。 先頭アドレスはa->start_row_listが全部持ってました。 回答していただきありがとうございました。

質問者からの補足

回答ありがとうございます。 やはりうまくいきませんでした。 非効率ですが、for前で大きめにmallocすしてfreeするしかないのかなとも思い始めています。

  • 回答No.3

あ、良く見たら、 last_item = new_item; で、更新してるからアドレスは全て入ってますね。 でもなー。この malloc(sizeof(item)) は、サイズ変わらないじゃないですか? オート変数で固定値切るか、ループに入る前に(M-1)*(num-1)分itemのmallocしといて、最後にfree()を先頭アドレスだけやる方が速いですよ。 まあ、リスト管理の最後ちゃんとNULLになってるから、iのループとrightのアドレスNULLになるまでfreeしても構いませんが。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

無事解決いたしました。 先頭アドレスはa->start_row_listが全部持ってました。 回答していただきありがとうございました。

質問者からの補足

回答ありがとうございます。 質問上固定長にしましたが、numの部分は実際のプログラムでは固定長ではないので困っています。

  • 回答No.2

last_item->right = new_item; で一つ前のリストにmallocしたアドレス管理してるのかな? でも、この for (j = 0; j <= num-1; j++) { 内のループで last_item->right のアドレス書き潰してるから、全部開放出来ませんよ。

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 関数自体を変更するしかないのでしょうか?

  • 回答No.1
noname#20242

一番先頭のポインタはどこかで覚えておく必要があると思います。 そして開放時に下記のような処理でいいのではないでしょうか? item* del_item; top_item = 先頭; while (top_item != NULL) { del_item = top_item; top_item = top_item->right; free(del_item); } 一番先頭のポインタを覚えたくない場合は、item構造体に void* left; を追加して、逆にたどっていけるようにする方法もあります。 item* del_item; while (new_item != NULL) { del_item = new_item; new_item = new_item->left; free(del_item); }

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 試してみましたが、メモリが増え続けています。 No.2の回答者がおっしゃる通り、全部解放は出来ないんでしょうか。

関連するQ&A

  • 2次元配列の動的確保について

    共分散行列を2次元配列に格納しようとしているのですが、 その要素は、左下半分と右上半分が同じになるため 対角要素と、どちらか半分だけを格納してメモリを節約したいと考えています。 以下のように動的確保することでメモリは節約できているでしょうか? if( (a = (double **)malloc(sizeof(double *) * (N) ))==NULL ){ fprintf(stderr, "error malloc for a\n"); exit(0); } for( i=0; i<NN; i++ ){ if( ( a[i] = (double *)malloc(sizeof(double) * (i+1) ))==NULL ){ fprintf(stderr, "error malloc for a\n"); exit(0); } } *節約しない場合は、i+1 が N になります。 確保できているのなら、どのように参照すればいいのでしょうか?データの並び(?)は、a[0][0],a[1][0],a[1][1],a[2][0],a[2][1],a[2][2],,,というように並んでいるでしょうか? 例えば、a[0][1]を参照しようとすると、シグメンテーションフォルトなど起こりうるでしょうか。必要であれば、上プログラム内Nは、3000程度と考えてください。 そして、もし他にメモリを節約する上で良い方法があれば、ご教授していただけたらと思います。 よろしくお願い致します。

  • c言語で2分探索木のを2分木に変えたい

    2分木のプログラムを書いているのですが、ある数列を2分木にしたいのです。 2分探索木のプログラムを参考に書いていて、その一部が typedef int BSTREE_K_TYPE; typedef int BSTREE_V_TYPE; struct bsnode { BSTREE_K_TYPE key; BSTREE_V_TYPE value; struct bsnode *left; struct bsnode *right; }; typedef struct bsnode BSTREE_NODE; int gShortFormat = 1; void error(char *msg){ fflush(stdout); fprintf(stderr, "%s\n", msg); exit(1); } BSTREE_NODE *createNode(BSTREE_K_TYPE x){ BSTREE_NODE *new; new = malloc(sizeof(BSTREE_NODE)); if(new == NULL) error("createNode: メモがありません"); new->key = x; new->value = 0; new->left = NULL; new->right = NULL; return new; } BSTREE_NODE *insertNode(BSTREE_NODE *p, BSTREE_K_TYPE x){ if (p == NULL){ } else if (p->key == x){ error("insertNode: 指定キーのノードが含まれています"); } else if (p->key > x){ p->left = insertNode(p->left, x); } else { p->right = insertNode(p->right, x); } return p; } BSTREE_NODE *inputBSTree(BSTREE_NODE *btree, char *str[], int len, int *end){ BSTREE_K_TYPE x; int i, n = 0; for(i = 0; i < len; i++){ if(!strcmp(str[i], "--")) break; x = atoi(str[i]); if(btree == NULL) btree = createNode(x); else btree = insertNode(btree, x); n++; } *end = n; return btree; } このinsertNodeのifの条件を変えればいいのかと思い、いろいろ試してみたのですが、 左部分木には左側にしか葉がなく、右部分木には右にしか葉がないようなものしかできませんでした もう何時間も悩んだのですが自分の知識では手づまりです どうかよろしくお願いします。

  • 単方向リスト

    #include<stdio.h> #include<stdlib.h> #include<string.h> struct Address{ char name[100]; char tel[100]; char email[100]; }; struct AddressList { struct Address addr; //データそのもの struct AddressList *next; //後続ノードへのポインタ struct AddressList *prev; }; struct AddressList *this,*last,*new,*first; struct Address *addr; /*--------ここからmain関数------------*/ int main(void){ int n,i; //何番目に入れるか? char quit[100]; //繰り返しを止める時に利用。 first=last=NULL; //まず初期化 addr =(struct Address *)malloc(sizeof(struct Address)); if(addr==NULL){ fprintf(stderr,"malloc:error\n"); exit(1); } while(-1){ printf("整数を入力してください。\n"); scanf("%d",&n); printf("名前を入力してください。\n"); scanf("%s",addr->name); printf("電話番号を入力してください。\n"); scanf("%s",addr->tel); printf("メールアドレスを入力してください。\n"); scanf("%s",addr->email); new =(struct AddressList *)malloc(sizeof(struct AddressList)); //新たに加えるリストの動的メモリー確保 if(new==NULL){ fprintf(stderr,"malloc:error\n"); exit(1); } new->addr=addr; //ここでエラーが発生します。 new->next=NULL; incompatible types in assignment とエラーがでます。 型はあってると思うんですが、、、 よろしくおねがいします。

  • データ数を増やすとエラーになる

    typedef struct DATA{ int data; struct DATA *left; struct DATA *right; }node,*tree; tree makenode(int data) {     tree q;     if((q=(tree)malloc(sizeof(node)))==NULL){        printf("メモリ割り当てエラー\n");        exit(-1);     } q->left=NULL; q->right=NULL; q->data=data;   return q; } をつくり、for文でまわしながら、処理を行うプログラムにしたいんですが、まわす回数が4までだときちんと動くのですが5以上にすると エラーになってしまいます。なぜエラーになるか全くわかりません。 わかる方教えてください。お願いします。

  • メモリを解放しないとどうなる?

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • メモリの解放について

    C++でDirectXを用いたゲームを作成しているのですが、プログラムのコンパイルは通るのに、メモリの解放関数が行われると強制終了されエラーメッセージが出力されます。 デバッグをしてみて要因を調べてみましたが、特に強制終了するような問題があるとも思えないのです。(ただ自分の知識不足であると思いますが) ためしにエラーが出ている部分をコメントにしてみたら、そしたらヒープが壊れてるとのエラーメッセージが出るのですがどう対処したらいいでしょうか? ちなみにRELEASEする変数の中身はちゃんと入ってます。 ソース: const int MAXFONT = 16; LPD3DXFONT g_pxfonts[MAXFONT]; LPD3DXSPRITE g_ptextsprite = NULL; int d=0; void DirectGraphics::CleanupD3D(){ //フォント解放 for(d=0; d<MAXFONT; d++){ if(g_pxfonts[d]!=NULL){ g_pxfonts[d]->Release();//エラー } } if(g_ptextsprite) g_ptextsprite->Release();//エラー //メッシュ、テクスチャ解放 for(d=0; d<MAXMODEL; d=d+1){ if(g_models[d].used == TRUE){ if(g_models[d].pmaterials != NULL){ delete[] g_models[d].pmaterials; } if(g_models[d].ptextures != NULL){ for(DWORD j=0; j<g_models[d].nummaterials; j=j+1){ g_models[d].ptextures[j]->Release(); } delete[] g_models[d].ptextures; } if(g_models[d].pmesh != NULL){ g_models[d].pmesh->Release(); } } } if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } エラーの出ているフォントの変数の中身はこちらに入れております。 //ゲーム用のフォントを作成 int DirectGraphics::CreateGameFont(LPCTSTR fontname, int height, UINT weight){ //空いている要素を探す int idx; for(idx=0; idx<MAXFONT; idx=idx+1){ if(g_pxfonts[idx] == NULL) break; } if (idx>=MAXFONT) return -1; //フォントを作成する HRESULT hr = D3DXCreateFont( g_pd3dDevice, -height, 0, weight, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, fontname, &g_pxfonts[idx]); if( FAILED( hr ) ) return -1; return idx; }

  • ファイルをオープンするときのエラー

    C言語であるファイルにある数値を100ごとに合計して,ほかのファイルに書き出す。しかし,実行するとエラーでてきます。原因はわからないです。因みに,オープンしたいファイルをほかのディレクリに置いたら,ファイルが見付かりませんとのエラーがありました、WindowsのC言語でカレントディレクトリを探すときは何の関数を使えばいいでしょうか? int main(void) { int i,k; int num; char filename[64],fileread[64],filewrite[64]; FILE *fp0,*fp1; double sum1,sum2,sum3; int *ch[3]; sum1=sum2=sum3=0.0; printf("ファイル名を入力ください!\n"); scanf("%s",filename); fprintf(stderr,"\n%s\n",filename); sprintf(fileread,"C:\\%s.txt",filename); fprintf(stderr,"%s\n",fileread); sprintf(filewrite,"C:\\%s.csv",filename); for (i=0;i<3;i++) { if ( (ch[i]=(int *)malloc(4*30))==NULL ) { fprintf(stderr,"Cannot get memory <ch[%d]>.",i); return -1; } } fprintf(stderr,"%s\n",filewrite); if ((fp0=fopen(fileread,"rb"))==NULL) { fprintf(stderr,"Cannot open file %s\n",fileread); return 0; } fscanf(fp0,"%d", &num); if((fp1=fopen(filewrite,"wb"))==NULL) { fprintf(stderr,"Cannot open file!%s\n",filewrite); return 0; } for(i=0;i<50;i++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); } for(i=0;i<num/100;i++) { for (k=0;k<100;k++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); if ( feof(fp0) != 0 ) break; sum1=sum1+*(ch[0]); sum2=sum2+*(ch[1]); sum3=sum3+*(ch[2]); } fprintf(fp1,"%d %d %d\n",sum1,sum2,sum3); } fclose(fp0); fclose(fp1); return 0; }

  • 相互相関関数

    相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。 ちなみに参考にしたのは、 http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec02/taro12-sjt0_p13_2... の最後の2ページで、入力のサンプルデータは、 http://www.mech.tohoku-gakuin.ac.jp/nken/java/new2/crosscorr7/cross... のデータを用いました。結果画像を添付します。 #include "stdafx.h" #include <stdio.h> #include <math.h> #include <stdlib.h> #define MAX 10000000 #define buf 256 int main (){ FILE *fpi; //_入力ファイル FILE *fpo; //_出力ファイル int num; //_対象波形全点数 double *x,*y; //_波形データ double *cxy1,*cxy2;//結果 char filename[buf]; /////////ファイルオープン/////////// (省略) ////////////データ読み込み/////////////////// if(((x=(double*)malloc(MAX))==NULL)||((y=(double*)malloc(MAX))==NULL)){ fprintf(stderr,"Can't_allocate_memory.\n"); return 0; } num=0; while ( fscanf(fpi,"%lf,%lf",&x[num],&y[num]) != EOF && num < MAX ){ num++; } printf("%d",num); ////////相互相関関数////////////////////////// if(((cxy1=(double*)malloc(MAX))==NULL)||((cxy2=(double*)malloc(MAX))==NULL)){ fprintf(stderr,"Can't_allocate_memory.\n"); return 0; } int i,j,n; double sum; n = num-1; //////////////ずらし幅が負の時の演算//////////// for( i=0; i<n; i++ ) { sum = 0.0; for( j=0; j < n-i; j++ ) { //k = (j + i) % num; sum = sum + x[j] * y[j+i]; } cxy1[i]=double(sum/(n-i)); } ////ずらし幅が正の時の演算/// n = num-1; for( i=0; i<n; i++ ) { sum = 0.0; for( j=0; j < n-i; j++ ) { //k = (j + i) % num; sum = sum + x[i+j] * y[j]; } cxy2[i]=double(sum/(n-i)); } /////////結果の出力/////////////// for(i=0;i<n;i++){ fprintf(fpo,"%f\n",cxy1[i]); } for(i=0;i<n;i++){ fprintf(fpo,"%f\n",cxy2[i]); } ///////////////////////// fclose(fpi); fclose(fpo); free(x); free(y); free(cxy1); free(cxy2); }

  • 動的メモリ 解放がうまくいかない

    よろしくお願いします。 一ファイル20万行程度のCSV形式のテキストファイルが、50個ほどあります。 これを一行づつ読み込んで、strtok( ,",")でデータを取得しようと思っています。 ファイルの行数はまちまちなので、新しいファイルを読み込むときに そのファイルの行数を調べて(ここでは count 行あります) callocをつかって、メモリを確保しました。 btxt=(char **)calloc(count,sizeof(char *));/*動的メモリ確保*/ for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/ if(btxt==NULL){printf("btxt 確保エラー\n"); exit(0);} 上記btxt配列にすべての行数を読み込んで、strtok()処理をした後 for(v=0;v<120;v++){ if(btxt[v]){ free(btxt[v]); btxt[v]=NULL; }  } free(btxt);  btxt=NULL; で解放してから、次のファイルに移ります。 問題は、ループするごとにメモリ容量がどんどん減ってきて、30ループもさせると メモリ不足でエラーが出ることです。 ブレークポイントを使って調べてみたのですが ループ一回目 calloc前 707.7 MB: calloc後 748.6MB 解放(したつもり)後 747.9 MB ループ二回目 calloc前 750.6 MB: calloc後 794.6MB 解放(したつもり)後 793.8 MB ・・・・・・・・・・・・・・・・・・・ ループ四回終了時には868.3MBにもなって、初めより160MBも使ってしまいます。 free()が効いてないと思うのですが、どこがおかしいのか教えてくださいませ。

  • 動的メモリとexit(C言語)

    fpA=fopen("name1", "r"); fpB=fopen("name2", "r"); fpC=fopen("name3", "r"); if(fpA==NULL || fpB==NULL || fpC==NULL){ exit(1); } fpAとfpBのファイルオープンに成功してfpCで失敗した場合、exit(1)によってfpAとfpBはクローズされますよね? じゃあ、 a=malloc(size); b=malloc(size); c=malloc(size); if(a==NULL || b==NULL || c==NULL){ exit(1); } aとbのメモリ確保に成功してcで失敗した場合、aとbのメモリはどうなっちゃうんでしょう?exitは動的メモリも解放してくれるのですか? とりあえず以下のようにしてますが…。 a=malloc(size); b=malloc(size); c=malloc(size); if(a==NULL || b==NULL || c==NULL){ free(a); free(b); free(c); exit(1); }