• 締切済み

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

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

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

電源を入れる=プログラム開始でシンプルな組み込みプログラムの場合、mallocしたらプログラムは動きっぱなしなのでそもそもfreeしないと思います。ただ、この様なプログラムの場合、そもそもmallocじゃなくてグローバルな変数領域で事が足りるので使うかどうか疑問があります。それにmalloc自体も処理系依存なので、mallocが出来ない組み込み環境も当然あるわけで、メモリ管理の方法自体がOSや起動方法などの状況によります。 アプリが終了してメニューに帰るような組み込み系(携帯電話等)なら当然メモリをfreeしないとやばいのはわかりますよね? malloc/freeしなければ行けないのは、次のような状況が重なった場合です。 (1)処理するデータを起因として必要とするメモリが可変する。 (2)同時に2種類以上のデータを処理する。あるいは、最低限のメモリで動くように義務付けられたマルチタスクのアプリである。 (3)同時に処理するデータ量の予想最大量でメモリを消費するとメモリが足らない(可変メモリを採用する必然がある)。 (4)次から次へとデータを処理するかメモリを必要とする別プログラムが同時にマルチタスクで動いているため、用が済んだメモリを解放する必要がある。 ただし、仮想記憶が使えない状況(OSやハードの制限)ではメモリのフラグメンテーションが多発しますので、可変長そのものを扱うことに無理がある場合があり、組み込み系でメモリ管理の仕組みの決定はより慎重でなければいけません。

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

組込みであろうがなかろうが、mallocすればfreeしなければなりません(どのタイミングかは別として)。 ただし、組込みの場合には、使い勝手の悪いmallocそのものではなく、メモリプールなど、別の関数を使って動的なメモリ管理を行うことが多いと思います。 # 一口に組込みといっても、HDDレコーダと自動車と湯沸しポットでは、明らかに勝手が違うと思いますが...

  • crew21
  • ベストアンサー率26% (58/222)
回答No.3

その「誰か」が言われたことは、ある意味当たってるしある意味外れてると思う。 ※つか、質問者さんの文章の「行間」に何かありげな気がします。 ・当たってる点  確かに一度mallocしたら、放っておいたらfreeはされません(いつの間にかfreeされたら、たまったもんじゃないですよね)。  freeのためにはそれこそ電源を切るしかないです。但しこの行為は、結果的にfreeには違いないけど、意味的に全然違うことですよね。 ・外れてる点  一度mallocしても、サイズが決まってようがいまいが、誰か(基本的にmallocした人)がfreeをかければfreeされます。当たり前のことですが... まとめて言うと、組み込み系には多くの場合メモリ量の限界が意識されるものですが、それとメモリのmalloc,freeは関係在るようであまり関係ありませんよ。 極端な言い方をすれば、「残メモリ>mallocしたいメモリ量」であればmallocできますし(あくまで極論ですよ)、 先にも書いた通り、一度mallocしたメモリは基本的に誰か(普通はmallocした人)がfreeするまでmallocされたままになります。

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

あなたの聞いた話は、その通りで、スキルのお持ちの方のご意見かと 思います。 組込み系がそうなのは、MMU(ハードウエア的なメモリ管理ユニット) がない環境がほとんどということも理由のひとつにあります。 組込み系でmallocのような動的にメモリを確保については、本来問題 があります。つまりメモリを確保したり、開放したりを実動作で 実行した場合に一時的にメモリが不足する場合があります。 理由は、メモリを使いすぎた場合もありますが、メモリが穴ぼこ つまりフラグメンテーションがおきて確保できないことなどが 発生します。組込みシステムではメモリが足らないから空くまで 待つとかいうことがシステムとしては受け入れらない場合が多いです。ですの でメモリ不足が起こらないようにします。方法としては大きく2つあって ひとつは不足しないようにメモリを多くつむ。もうひとつは これは実際には動的確保ではありませんが、プログラムの最初で 必要なメモリをすべて確保してから使うケースで今回のご質問のケース です。 結局静的に変数を使うのと 同じようですが、プログラミングの構造上テストがしやすかったり ハードウエア構成上mallocを通したほうがメモリのハンドリングが しやすい場合があります。 ただ、組込み系でも、ネットワークとかするものの場合には いわゆるTCP/IPスタックとかは、内部で動的メモリ確保がいくつか 使われているケースがほとんどです。 それからデジカメの画像を本体メモリに保存するタイプとかは mallocみたいなの(可変長メモリプール)でしている場合も あります。これって明らかにメモリが不足して撮れなくなってOK ですから。

hunity
質問者

お礼

すごくご丁寧にありがとうございました。 理解できました。

回答No.1

>組み込み系ではサイズが決まっている場合 組み込み系じゃなくても上限サイズは決まってる >電源を切る=メモリ開放 これも組み込みに限らず >組み込み系ではサイズが決まっている場合、一度mallocすればfreeはしない mallocの用途からして理解出来てない 基礎から勉強し直した方がいいよ 組み込みをやるには10年早いと思う

hunity
質問者

補足

よくわからないですが、 組み込み系じゃなくても上限サイズは決まってるっていうのは C言語でいう、ヒープ領域が決まってるということですか? 私が言いたかったのは、電源切るまで必要なメモリ領域が動的に変わらない 場合、mallocすればfreeはしないでいいの?ってことです。 最後の文もですけど、なにが理解できてないんでしょうか? スタック領域に空きがすくないときにmallocでメモリを確保して使うのって おかしいですか?

関連するQ&A

  • mallocでメモリーを確保しようとすると暴走します

     組み込み系のプログラミングをやっているもので、malloc、freeを使って動的にメモリーの確保、開放を行っているのですが、途中で暴走してしまいます。 (mallocを呼び出すと、返ってこなくなります。)    そこでmallocの動作を見ようと、以下のプログラムを作って動作させると、while文の中を一周はするのですが、2週目のp2のポインターの値が返ってきません。(malloc関数の中でloopしています。)     /* 以下ソースコード */  char *p1;  char *p2;  char *p3;  char *p4;  while(1){    p1 = (char*)malloc(100);    p2 = (char*)malloc(100);    p3 = (char*)malloc(100);    free(p3);    p4 = (char*)malloc(100);    free(p4);    free(p2);    free(p1);  }  ※メモリーは、2k確保していあるので、サイズがオーバーしているということはないと思います。  ご質問ですが、  ・上記ソースコードで暴走するような要因がありますでしょうか?  ・malloc、free関数でメモリーの取得、開放の順番など注意しないといけないことがあるのでしょうか?  ・malloc、free関数等を自作とかされていますでしょうか?  どうぞよろしくお願い致します。

  • malloc関数 free開放とはなんですか?

    malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?

  • mallocしたメモリの開放

    かなり基本的なことですいませんが、 下記のようなイメージのコードで確保したメモリを 確実に開放するにはどうしたらいいでしょうか? やりたいこととしては、動的に確保したメモリにデータを 入れて、それをベクトルに入れて使いまわしたいです。 下記のコードからfreeの部分をやめても大丈夫でしょうか?その場合、どうやってメモリ開放するんでしょうか? ベクトルが消滅すればメモリが開放されるんでしょうか? テストしてみましたが、減った気配がない。。。 根本的に考え方がおかしいかもしれません。。。 お助けください。 お願いします。 wchar_t str[6] = L"あいうえお"; wchar_t* mem = (wchar_t*)malloc(6 * sizeof(wchar_t)); wcsncpy(mem, str, 6); std::vector<wchar_t*> vetorTemp; //実際グローバル変数 vetorTemp.insert(vetorTemp.end(), mem); free(mem); // ここで開放するとvetorTempの中身も利用できなくなってしまった

  • mallocについて

    まだ初心者で分からないところがあるのですが 例えば char *Buf; Buf=(char *)malloc(256); free(Buf); としますよね? それを、 グローバル変数(?)で「char *Buf」として 処理の途中途中で Buf=(char *)malloc(*適当) を、何回も使い 最後の解放されるときに free(Buf) (*適当 は、適当な数値) を使う事は大丈夫でしょうか? それとも、ちゃんとメモリを割り当て(?)たら 使ったあとすぐに、メモリを解除しなければ ならないのですか? よろしくお願いしますm(_ _)m

  • mallocとfree

    struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。

  • malloc でのメモリ取得状況の可視化

    Cで作成したWinXPで動くプログラムです。 malloc - free を繰り返して使っていると、どうもメモリが断片化するらしく、よくメモリ不足でエラーになります。free で開放したつもりで、開放できていないという可能性も否定できません。 そこで、メモリ確保状態を可視化できるツールなどありましたら紹介お願いします。 アプリのソースリストがありますので、可視化するプログラムを埋め込むことも可能です。そのようなライブラリのご紹介も歓迎です。 よろしくお願いいたします。

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

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

  • C言語 mallocとfreeについて

    mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。 いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。 これに対する解決策をご存知の方いらっしゃいましたら教えてください。 よろしくお願いします。

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

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

  • 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 というエラーがでます。

専門家に質問してみよう