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 について質問です
-
Blue
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について 確認しました。 言われてみれば、* は最後に解決されますね。 運良く(?)コンパイル通らなかったから気付けたけど、 コンパイル通ってたら絶対気付かねー。