• ベストアンサー

大容量をmalloc()した後にfree()

C言語でシステム開発しています。 大容量をmalloc()した後にfree()すると、プロセスが強制終了してしまいます。 malloc()のサイズが小さい場合は問題がありません。 こういった場合にプロセスが強制終了しない方法はないものでしょうか?。 ご存知の方がいらっしゃればお教えいただきたいです。 以上です。

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

  • ベストアンサー
  • sub_6
  • ベストアンサー率60% (14/23)
回答No.3

malloc() の戻り値がNULLだったりしませんか?領域不足の場合malloc()の失敗はありえます。

その他の回答 (3)

回答No.2

freeした瞬間に強制終了するとしたら、#1さんの仰るとおり、mallocからfreeするところの間のバグの感がしますね。 freeしたときに死ぬところだけ聞くと、すでにfreeしたところをfreeしている場合、ポインタが破壊されていて、関係ないところをfreeしてる場合、mallocライブラリーの管理ブロックをオーバーランして破壊している場合、freeしたブロックに書き込んでいる場合などがまず思いつきます。 valgrindなどメモリー用のデバッグツールでまずは検証してみてはいかがでしょうか?

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

malloc()直後にfree()してるだけですか? void *ptr = malloc(~); // 何もしない free(ptr); ではなく間に何らかの処理があるのなら、 それはmalloc(),free()の問題ではなくて その間の処理におそらく問題あります。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

malloc()直後にfree()してるだけですか? void *ptr = malloc(~); // 何もしない free(ptr); ではなく間に何らかの処理があるのなら、 それはmalloc(),free()の問題ではなくて その間の処理におそらく問題あります。

関連するQ&A

  • mallocとfreeについて

    int* make_matrix(int size){ int *p; if((p = (int*)malloc(sizeof(int)*size*size)) == NULL){ printf("cannot malloc\n"); exit(1); } return p; } int* add_matrix(int* a, int* b, int size){ int i,j; int* c = make_matrix(size); for(i = 0; i < size; i++) for(j = 0; j < size; j++) c[i*size+j] = a[i*size+j] + b[i*size+j]; return c; } 上記のようなsize×sizeの行列を加算する関数を作ったのですが、この関数を用いてa,b,cの3つの行列を加算したいときに d = add_matrix(add_matrix(a,b,size),c,size) このように書いた場合、add_matrix(a,b,size)の戻り値をどのようにfree()すればよいのでしょうか。

  • malloc関数の使い終わった後の開放について

    今、Cでmalloc関数を使った簡単なプログラムを作っています。 それを作っているときに思ったのですが、mallocを使って出来た領域を、freeで開放する前に異常終了したとします。 そういったときに開放する方法はないのでしょうか? 学校の先生から聞いた話によると、「パソコンを次に立ち上げたときに開放される」みたいなことを聞いたのでやらなくてもいいのかも知れませんが、気になるので教えてください。

  • gdbmみたいな簡易データベースライブラリ

    Unix系OSでC言語で、あるサービスのデーモンプロセスを開発しているのですが・・ 簡易データベース(キー1個に対して値1個が検索できるような)のライブラリで、且つ、mallocを内部で使わないタイプのライブラリ、ないでしょうか? 普通はgdbmなどを使うところなのですが、gdbmは内部でmallocを呼び出しているので、デーモンプロセスで継続的に使うには向かないかも?と思いまして・・ それとも、mallocやfreeを何度も呼び出すことによるガーベージコレクションの問題は、あまり気にしなくてよい、のでしょうか?

  • mallocで確保したメモリをfree解放する必要

    当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。

  • malloc後、frokを行った場合

    unix(Solaris)系、CCコンパイラ初心者です。 質問内容は2点あります。 1点目 たとえば変数Aを親プロセスでmallocを行い、その後forkした場合は 変数Aは子プロセスにも引き継がれると思いますが、 解放する場合は親、子プロセス両方でfreeする必要はあるのでしょうか? 2点目 1点目のmallocした変数Aをshmで共有メモリにした場合は 親又は子どちらか片方でfreeすればよろしいのでしょうか? よろしくお願いします。

  • mallocの挙動について

    現象自体は解決してるのですが、私自身イマイチ理解できていないので質問させて下さい。 [問題] C言語で書かれたある32bitアプリを32bitのサーバA、64bitのサーバBでそれぞれ実行すると、サーバAは正常終了し、サーバBはmallocでNULLポインタが返され異常終了した。  サーバA:Windows Server 2003 R2 Standard Edition SP2 メモリ4GB実装  サーバB:Windows Server 2003 R2 Standard x64 Edition SP2 メモリ6GB実装 ・ソースをデバッガで確認したがメモリリーク等はなさそう。(_CrtSetDbgFlagや_heapchk()も試しました)。 ・実行結果もサーバAは期待した実行結果が得られています。 ・メモリの最大使用量は1.6GB弱の様です。 ・開発環境は”WindowsXP+Visual Studio 2003”です。 ・両サーバ共に私の占有状態で、余計なプロセスは実行されておりません。 ・サーバAは3GBオプション(boot.ini)を使用していません。 [解決法] プロジェクト-プロパティ-リンカ-システム-大きいサイズのシステムの項目で、  ”2GBを越えるアドレスをサポートする(/LARGEADDRESSAWARE)” に設定してビルドするとサーバBでもアプリが正常終了するようになりました。 [質問] 私の認識としては上記オプションは2GB以上のメモリを使用できるようにするだけで、使用するメモリ量が2GB以内なら、どちらのサーバで実行しても同じだと思っていたのです。 なので、このオプション無しでメモリが多い方のサーバBでmallocのメモリ確保が失敗する現象の関連性がいまいち理解できていません・・・ この件で知識をお持ちの方ご教授願えませんか?

  • mallocについて

    mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。

  • 組み込み系でのmallocについて

    組み込み系について勉強しいます。 組み込み系ではサイズが決まっている場合、一度mallocすればfreeはしないと誰かが言ったのを聞いたのですがどういうことですか? 電源を切る=メモリ開放 ということですか? よろしくおねがいします。

  • malloc.cを見たい

    TurboLinux10でとあるプログラムを実行していましたが、 coreファイルを吐き出してGUIが終了してしまうことがあります。  gdb -c core.**** 実行ファイル名 というコマンドでGUIが終了した原因を調べたところ、  kernel/malloc.c:3415  kernel/malloc.c そのようなファイルやディレクトリは見つかりません。 と出ていました。 malloc.cというソースファイルを見たいのですが、 どこから入手すればよいでしょうか。 TurboLinux10は「全パッケージ」を選択してインストールしており、 カーネル再構築もできるのでカーネルのソースファイルは入っているはずですが、 最低3415行もあるmalloc.cは存在しません(十数行の同名ファイルはありました)。 TurboLinux10DesktopのソースファイルをFTPサーバーからダウンロードしようと、 ftp://ftp.turbolinux.co.jp/pub/TurboLinux/TurboLinux/ia32/Desktop/10/source/SRPMS/ に行ってみたのですが、 勿論malloc.cが入っていそうなパッケージがわかりません。 (そもそも、「malloc.cが見つからない」と出た場合にmalloc.cを入手してくるべきなのでしょうか)

  • mallocについて

    vine linux 3.0上でgccを使い下記のようなプログラム(読みにくいプログラムで申し訳ありません)を作成してみました。無事コンパイルも通りメモリも確保出来ました。 しかし、このプログラムを2つ起動しそれぞれでメモリを確保するとおかしな事が起きるのです。どういう症状かと言うとプログラム1もプログラム2も同じ先頭アドレスを確保しているのです。 例) プログラム1 keep memory size : 11 address : 0x8049700 プログラム2 keep memory size : 11 address : 0x8049700 なぜこのような事が起こるのでしょうか? ご教授宜しくお願いします。 #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { int size; unsigned int *p; char buf; size = atoi(argv[1]); printf("keep memory size : %d\n", size); p = (unsigned int *)malloc(size); printf("address : %p\n", p); scanf("%c", &buf); free(p); }

専門家に質問してみよう