malloc と free について質問です。 作成しているプログラムで、場合によってはデータ数が跳ね上がるので データ数を可変にしたいと考えています。 そこで、意味も分からず malloc と free を使ったところ、 割当には成功するものの解放が出来ません。 気になるところ ※1、※2の部分 どこがいけないのでしょうか? とりあえずコンパイルが通ったのでOKとしてますが、根本的にダメかも知れません。 以下、ソース。 とりあえず、実験なのでコンソールアプリです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> //====================================== // 構造体定義 //====================================== typedef struct { int id; } INFO_T; typedef struct { int use; INFO_T *info; } LIST_T; //====================================== // メモリ割当 //====================================== int add_data( INFO_T **info ) { *info = (INFO_T *)malloc( sizeof(INFO_T) ); if( *info == NULL ){ return 0; } // .id でも ->id でもダメ <-- ※2 // id = 1 にしたい printf("%08x\n", *info); return 1; } //====================================== // メモリ解放 //====================================== int del_data( INFO_T **info ) { free((char *)*info); return 1; } //====================================== // メイン //====================================== int main(int argc, char* argv[/url]) { int i, n; char c[128]; LIST_T data[20]; memset(&data, 0, sizeof(data)); srand((unsigned)time(NULL)); // 初期状態 printf("=== 初期状態 ===\n"); for(i=0;i<20;i++){ printf("%2d: %08x\n", i, data.info); } printf("=== メモリ割当中 ===\n"); for(i=0;i<5;i++){ n = rand()%20; if( data[n].use == 0 ){ if( add_data( &data[n].info ) != 0 ){ data[n].use = 1; data[n].info->id = 1; printf("%08x(id=%d)\n", data[n].info, data[n].info->id); } }else{ data[n].info->id++; printf("%08x(id=%d)\n", data[n].info, data[n].info->id); } } // メモリ割り当て済み printf("=== メモリ割当済 ===\n"); for(i=0;i<20;i++){ printf("%2d: %08x\n", i, data.info); // メモリの解放 del_data( &data.info ); } // 初期状態のハズ? <-- ※1 printf("=== メモリ解放後 ===\n"); for(i=0;i<20;i++){ printf("%2d: %08x\n", i, data.info); } printf("終了します@Input Any Keys..."); scanf("%s", c); return 0; }
malloc と free について質問です
malloc と free について質問です
Re:malloc と free について質問です
freeって、自動的にNULLを入れるような機能はないはず。
(そうならfreeの引数はポインタのポインタになっていないと)
※2は何をしたいのかよくわからないです。
(そうならfreeの引数はポインタのポインタになっていないと)
※2は何をしたいのかよくわからないです。
Re:malloc と free について質問です
まず、free() しても動的に確保したメモリの中身は、(恐ろしいことに)しばらく、何の変化もありません。
ですから、何かを見て、free() したかどうかを知ることはできません。
あと、※2のところは、
(*info)->id = 1;
ですね。
ですから、何かを見て、free() したかどうかを知ることはできません。
あと、※2のところは、
(*info)->id = 1;
ですね。
Re:malloc と free について質問です
http://www.st.rim.or.jp/~phinloda/cqa/cqa4.html Q 【freeした直後の領域】 確かに、NULLにはならないようですね・・・。 使ったことない関数なので、知りませんでした。 そこで、 int del_data( INFO_T **info ) { INFO_T *next = NULL; free((char *)*info); *info = next; return 1; } とすれば、※1 の部分は初期状態と一致しました。 ・・・が、自分で NULL を入れているのでそれは当たり前。 本当に解放されているのでしょうか? malloc, free なんて使ったことが無いので、さっぱり分かりません。 構造体配列が0~21735個で、平均で40個ぐらいなので、最大分を固定で取ると、 このデータだけで数百キロバイトになってしまうので、動的にしようと思った次第です。 ※2は、 info->id = 1; info.id = 1; *info->id = 1; *info.id = 1; **info->id = 1; **info.id = 1; 全部コンパイルが通らないが、一体どうすれば入るのだろうって話です。
Re:malloc と free について質問です
※2について 確認しました。 言われてみれば、* は最後に解決されますね。 運良く(?)コンパイル通らなかったから気付けたけど、 コンパイル通ってたら絶対気付かねー。