アプリ版:「スタンプのみでお礼する」機能のリリースについて

mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。
いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。

これに対する解決策をご存知の方いらっしゃいましたら教えてください。
よろしくお願いします。

A 回答 (4件)

No.2です。



これはNGだよ。

for文使ってm回(28561回)のmalloc()をしてるんだよね。
それに対して、free()はfor文を出たあとの1回だけでしょ。
てことは、28561回目に確保したメモリだけは解放されるけど、1~28560回目までに確保しまくったメモリは解放されない(中に浮いたまま)ということになるからね。
当然パンクします。

free()をfor文の中に入れて、その確保したメモリが不必要になった都度free()するといいんじゃないかな。要はmalloc()とfree()が対になるようにするということ。
そうすればメモリの確保と解放のバランスというか論理性が取れて、少なくとも質問欄に書いたようなことはなくなると思うよ。

※1回ごとのメモリ確保量がどれくらいか、面倒だから見てないけど、それは気を付けてください。
 いくらmalloc()とfree()のつじつまがあってたって、一度に100MBとか確保しようとしたら、環境にもよるけど、まずダメだからね。
まあ、コードを見る限り構造体一つ分のメモリを確保しようとしているだけだから、常識的に考えてOKだとは思うけど。
    • good
    • 1

rもqもm回mallocしてますが、解放は最後の1回だけしかしてませんのでメモリ補足になるのは当たり前だと思います。


rとqを配列にしてループ回数格納するか、ループの範囲が間違ったプログラムだと思います。
    • good
    • 0

そんなことあり得ないとおもうけど...


ちょっとここに、具体的にどんな感じでmallocとfreeを使ってるか書いてみては?

あんまり長いと読む気なくなるから、不要なコードは削除して20行程度で。

よく新人さんである話だけど、
char *a = (char *)malloc(100);
とかやっといて、
free( *a ); とかやってない? 或いは free( &a ) とか。
もしやってるとすると全然おかしなところを解放していることになるよ。
    • good
    • 0
この回答へのお礼

crew21様

ご回答ありがとうございます.
コードの方,書かせていただきます.

void dijkstra(struct edge *E, struct edge *T, float *dstar, int n, int m, int m2, int st){
struct cell *adjlist[N]; /* グラフの隣接リスト */
struct cell *r, *q, *p;
m=28561;
for(i=0; i<m; i++){
v1=E[i].end1;
v2=E[i].end2;
r=(struct cell *)malloc(sizeof(struct cell));
  r->adj=v2; r->edge=i; r->next=adjlist[v1]; adjlist[v1]=r;
q=(struct cell *)malloc(sizeof(struct cell));
q->adj=v1; q->edge=i; q->next=adjlist[v2]; adjlist[v2]=q;
}
/*ここに取得したポインタを使ったダイクストラの計算が入ります.*/
free(r);
free(q);
return;
}

このようなコードになっています.
この関数を4回程度計算すると,メモリがいっぱいになってしまいます.
m=312の時は,300回以上繰り返し計算をすることができました.
やはり,mの値が大きく,負荷が大きいためでしょうか.
それとも,やはりメモリの開放がだめですか.

お礼日時:2007/12/08 14:15

小さなサイズと大きなサイズのmallocを繰り返していて、mallocした順に解放していないとメモリ不足になる可能性はあります。


環境が書かれていませんが、Windowsやパソコン用のLinuxであると仮定すると通常はありえないと思いますが、マイコンであれば十分にありえます。
もし、WindowsやLinuxであればmallocしたまま不要になってもfreeし忘れているか、システム的に無理があるほどメモリを利用していると思われますのでメモリの利用の仕方を再設計したほうが良いでしょう。
マイコンであれば、自分でメモリ管理関数を作って小さいサイズのメモリ確保はmallocに頼らないほうが無難です。
自分でガベージコレクトという手もありますが、遅くなるのでお勧めしません。
    • good
    • 0
この回答へのお礼

zwi様

ご回答ありがとうございました.
windowsを使っていてfreeもできていると思うのですが,大きなメモリサイズを確保させようとしているのが負荷がかかっているようです.

今はコマンドプロンプトからfor /L %d in (0,1,9999) %d do AAA.exeの文を使っています.
計算を細分化して繰り返し行い,システムに負荷がかからないようにしてみました.

お礼日時:2007/12/08 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!