Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

malloc メモリリークについて

#include<stdio.h> #include<stdlib.h> void alloconly(void) { const int sz=10; static int n=0; void *p; p=(void*)malloc(sz); if(p==NULL){ printf("動的確保不可 %d\n",n+1); printf("確保メモリサイズ %d byte\n",sz*n); exit(-1); } ++n; } int main(void) { for(;;){ alloconly(); } }と言うプログラムがある本に載っており、回答として   動的確保不可 *******(数字)   確保メモリサイズ *********byte(数字)となっていますが私の環境(Reshat Linux)では   強制終了します で終了してしまいます。原因が判らず困っています。ご解答願います。

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

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.5

正直、調べていました。私が提示したサンプルはこの場合意味ないみたいです。 「memory overcommit」 というものらしいです。解説は、URLにありますが、 ---------------------------------- カーネル2.4の場合に あまりに大きな確保要求は拒絶するが、そうでない場合には、 現在未使用の物理メモリ(以下ページフレームと呼ぶ)+未使用のswap" と要求のメモリ量を厳密には 見比べずに許可不許可を決めるという手法  ----------------------------------- 少し勉強になりました。 組み込み屋としては、信じられないアルゴリズムです。

参考URL:
http://d.hatena.ne.jp/yupo5656/20040624/p1
PHYOPHYO
質問者

お礼

幾度も回答をお考えになり、自分も諦めていたところ、正解を頂有難うごさいました。こてで次のページに進めます。 それにしてもc言語は0sによるところが多いやっかいな言語だなあと痛感しました。今後もよろしく願います。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

printfでmallocを使っている可能性はありますが、もし、printf内部でメモリ割付に失敗したのであれば、エラーを返して終了すべきであり、そうでなければライブラリの不具合です。 処理系によっては、mallocで管理しているヒープとスタックの領域を共有していることがあります。その場合、mallocに失敗するほどヒープを消耗した状態で関数呼出し(特にprintfのようなスタックを大量に必要とする関数)を行った場合、スタックオーバーフローになる可能性があります。

PHYOPHYO
質問者

補足

上記のプログラムで p=(void*)malloc(sz); printf("p=%d byte\n",p); printf("p=%p\n",p); を追加してバイト数とアドレスを表記させると0x4d087318と本来ならば入れないと思われる領域まで入り2時間以上無限にるーぷしてしまいます。何が原因なのかわかりません。 ご教授願えれば幸いです。

すると、全ての回答が全文表示されます。
  • yphkz4063
  • ベストアンサー率23% (34/144)
回答No.3

No.1様とNo.2様の回答は面白いですね。 その通りかもしれません。 そのプログラムが書いてある本の著者のスキルを疑ったほうがいいかも。 printfを実行せずにexit(-1)だけで終わってみれば。 ついでに正常終了はexit(0)で。

すると、全ての回答が全文表示されます。
  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

printf関数は、実は非常に大きなサイズのプログラムです。 そのプログラムの中で、malloc()などのメモリ確保をしようとしているかも しれません。 それだと、すでにmalloc()でエラーになっているので printfの中でエラーになり、エラー処理をしていない場合に強制終了する ことが考えられます。 RHLinuxで実行されたようですが、printfの仕様は同じでも実際のつくりは 環境によって違うと考えてください。特にエラー時の振る舞いは環境によってまちまちだと思います。 ですので、参考として、malloc()で取りつくしてエラーになった時点で、 メモリーを返却したサンプルを示しています。 返却によって、メモリーが元に戻ることを期待しています。 ただし、 このサンプルでも、メモリー返却時にマージする機能がないもの(OS) であれば全く無意味の場合もあります。

PHYOPHYO
質問者

補足

早速の補足説明ありがとうございました。 R32C様のプログラムを実行した所、countが1000000から始まり1000000単位でcountが増加し110000000迄進み強制終了で終了しました。 これは何を意味するのか分かる事ができません。 ご説明できれば幸いです。何度もすみませんが宜しくねがいます。

すると、全ての回答が全文表示されます。
  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

printfでも、mallocを使っているせいかも? とりあえず、エラー時に今まで確保したものを返せばよいのでは、 以下参考まで #include<stdio.h> #include<stdlib.h> typedef struct npb { struct npb *next; struct npb *back; char dum[10-sizeof(struct npb *)*2]; } NPB; void alloconly(void) { const int sz=10; static int n=0; static NPB npb; static NPB *np = &npb; np->next = malloc(sz); if(np->next == NULL) { //メモリを返す while (np->back) { np = np->back; free(np->next); } // メモリ返却終了 printf("動的確保不可 %d\n",n+1); printf("確保メモリサイズ %d byte\n",sz*n); exit(-1); } ++n; if ((n % 1000000) == 0) { printf("count = %d\n",n); } (np->next)->back = (NPB*)&np->next; np = np->next; } int main(void) { for(;;) { alloconly(); } }

PHYOPHYO
質問者

補足

printfでも、mallocを使っているせいかも?有りますがまだ初心者ですのでその理由が分かりません。その辺の理由をご教授ねがいます

すると、全ての回答が全文表示されます。

関連するQ&A