• ベストアンサー

自アプリ内のメモリを管理したい

こんにちは。 現在C/C++でプログラムを組んでいます。 C/C++でメモリを確保、開放するにはmalloc、new、free,deleteを使うわけですがアプリケーションが開始された時点で、ある一定のメモリを確保しておいてそのメモリから分け与えたりデフラグしたりして自分のアプリで使うメモリを管理したいと思っています。 BYTE* g_allMemory;//グローバル変数 g_allMemory = new BYTE[1024]; プログラムを実行した時点でこのようにメモリを確保しておき要所要所で自作関数を利用してメモリを分け与えたりデフラグしたりして使えるようにしたいのです。 しかしデフラグした瞬間に変数のアドレスがずれてしまって使い物になりません。 これを解決したいのですがアドバイスやお勧めのホームページや参考文献などがあったら紹介をお願いします。

  • 0xEF
  • お礼率59% (193/327)

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

  • ベストアンサー
  • kent85
  • ベストアンサー率52% (38/73)
回答No.2

#1さんが簡潔に述べていらっしゃるとおりです。 組み込みでRAMがあんまり無いのです…の世界向けではないですけど http://www.ibm.com/developerworks/jp/linux/library/l-memory/ ガベージコレクションあたりのキーワードで探すといろいろな情報に出会えると思います。 http://www.net.c.dendai.ac.jp/~takumi/

0xEF
質問者

お礼

ありがとうございます。 2つのHPを参考に少しがんばってみたいと思います。

その他の回答 (1)

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

メモリブロックへのポインタを直接扱うのではなく、ワンクッション置いてハンドルで操作するようにしてください。 そのままではシンタックスが面倒なので、適当なスマートポインタを実装すれば解決します。

0xEF
質問者

お礼

ありがとうございます。 前にも同じことを考えていたのですが今このアドバイスを受けてよい方法が思い浮かびました。 もう少しがんばってみます。ありがとうございました。

関連するQ&A

  • メモリを解放しないとどうなる?

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • メモリ確保エラー時の効率的な書き方

    mallocなどで複数の変数に対してメモリを確保する場合があると思います.例えば3つの変数の場合, char *a, *b, *c; a = (char *)malloc(100); if(a==NULL){ /* メモリ確保できなかったとき */ return (-1); } b = (char *)malloc(100); if(b==NULL){ free(a); return (-1); } c = (char *)malloc(100); if(c==NULL){ free(a); free(b); return (-1); } 変数が多くなるにつれて後から確保する変数のエラー処理(すでに確保したメモリのfree)が増えてしまうので,何か良い方法(コードが短くなるような)はないでしょうか?

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

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

  • クラスの宣言でのメモリ使用サイズの違い

    お世話になります。 現在、Visual Studio 2005にてMFCのC++のプログラムを作成しているのですが、そこでメモリの使用容量について疑問に感じた点があったのでこちらで、質問させて頂きました。 お聞きしたい内容は あるクラス1内で別のクラス2を宣言する際に、メンバ変数としてそのクラス2を宣言し、クラス1のコンストラクタでnewでメモリを確保し、デスクリタでdeleteする方法と、その都度クラス2の変数または関数が必要なときにnewでメモリを確保して、deleteで開放する方法とでは、メモリの確保等で違いがなにかありますでしょうか? また、クラス2をクラス1,クラス3で使用する場合には、クラス1,クラス3でそれぞれクラス2のオブジェクトを宣言するのと、クラス1でクラス2のオブジェクトを宣言し、そのオブジェクトをクラス3でexternするのではどちらの方がメモリの使用等からよい方法なのでしょうか? 今までほとんどメモリを気にせずにプログラムを作っていた為、メモリの使用の点ではほとんど無知な為、変な質問なのかもしれませんが、ご存知の方がいらっしゃいましたら、ご回答をお願い致します。 開発環境は Widows CE 6.0 Visual Studio 2005 です。

  • new と malloc によるメモリの動的確保について

    初めて投稿させて頂きます。よろしくお願い致します。 現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。 (コンパイラはMINGW32のg++ 3.4.5) //mallocによるメモリ動的確保 data = (char **)malloc(num * sizeof(char*)); for(i=0; i<rowNum; i++){ data[i] = (char *)malloc(sizeof(char)*256); } //newによるメモリ動的確保 data = new char*[rowNum]; for(i=0; i<rowNum; i++){ data[i] = new char; } C++で書くのならば、 「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」 という指摘が、書籍でもwebでもありましたので、 両方書き、両者を比べているのですが、理由がイマイチ分かりません。 10万行ほどのテキストデータで実験させてみたのですが、 mallocによる記述の方が、動作が数秒速いようなのです。 それで、new やmalloc で実際何をやっているのか、コードを見ようと思ったのですが、 newでは、 void* operator new(std::size_t) throw (std::bad_alloc); void* operator new[](std::size_t) throw (std::bad_alloc); void* operator new(std::size_t, const std::nothrow_t&) throw(); void* operator new[](std::size_t, const std::nothrow_t&) throw(); inline void* operator new(std::size_t, void* __p) throw() { return __p; } inline void* operator new[](std::size_t, void* __p) throw() { return __p; } というnewファイルの記述で行き詰まり、 malloc は malloc_allocator.hというファイルで行き詰りました。 以上を踏まえて、 1)そもそも、上記のメモリ動的確保記述はスマートな書き方なのか 2)実際に、newやmallocは、どういった手法でメモリ領域を確保しているのか 以上の2点について、ご教授下さい。よろしくお願い致します。

  • delete について教えてください。あちこち調べてみたのですが、解決

    delete について教えてください。あちこち調べてみたのですが、解決しません。 delete は、最初にその変数名で確保した領域を開放するのでしょうか、それとも現在その変数が差している領域を開放するのでしょうか? たとえば、 classe SampleClasse{ .......... }; SampleClasse *a, *b, c*; a = new SampleClasse; b = new SampleClasse; で 途中でa,bを入れ替えたとき、 c=a; a=b; b=c; delete a; というのは、現在のaの領域を開放するのでしょうか?それとも、new したときのaの領域(現在b)を開放するのでしょうか? ご教授お願いします。

  • メモリの開放について

    いつもお世話になっております。 メモリ開放のお作法について教えてください。 int* p ; p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ; free(p); このような記述をした場合、※の付いている2行でメモリ確保した 領域は開放されるのでしょうか。 (メモリ確保に失敗した場合の処理は省略してます。) よろしくお願いします。

  • メモリ不足になってしまう。

    教えてください。 現在陥っている現象:「メモリ不足になってしまう」配列の領域をRedimで動的に確保しようとしています。 例えば、 dim A() as byte dim B() as byte dim C() as byte redim A(8000,60000) redim B(8000,60000) redim C(8000,60000) 上記のように配列を確保する予定なのですが、 メモリ不足になってしまいます。 ひとつの変数の容量が480MB程度であると思います。 3つ全部でも1440MBであるのですが、物理的な メモリ容量は、512M*4を実装しています。 上記の変数名で言いますと、 Aの変数の領域確保には問題なく成功するのですが、 その次の行のBのところでエラーになります。 現在、物理的なメモリには空きがあるにもかかわらず このような現象になってしまい、困っています。 どなたか原因解決の糸口になるような回答をお持ちの方、 教えてください。

  • オブジェクトの生成やメモリの削除について

    class X{ ........ ........ ........ } に対し、 X *a=new X;//--------------1 ... ... ... a=new X;//----------------2 としてdeleteせずにnewをした場合、1の段階で作ったオブジェクトは削除されずメモリに残りっぱなしになるのでしょうか? これは、プログラムを終了しても残り続けるものなのでしょうか? また、mallocやcallocの場合はどうなるのでしょうか?

  • 2次元配列の数値管理をポインター操作で行いたい

    こんにちは。ちょっとわかりにくい説明かと思います。 行いたいイメージは byte test[2][X]= { {0,0,0,0,0},{1,1,1,1,1} }; というデータ配列Xの数が変動するので Mallocを使用して動的にメモリを確保したい。(ここでは例として5つとってますが) それをポインター変数により管理したいと考えています。 byte *test; byte num= 5; test = (byte *)MALLOC(sizeof(byte)*(2*(num))); というようにメモリを確保した後 ある文字列("01001"というような文字列)をこの配列にコピーしたい。 配列のイメージでは test[0]={{0,1,0,0,1}}; test[1]={{1,0,0,1,1}}; というような形で管理したいと思ってます。 pBuffer="01001"; memcpy(pBuffer, test[0], 5); pBuffer="10011"; memcpy(pBuffer, test[1], 5); このように実装しました。 これであってますでしょうか? さらに、ここからデータを取得したい場合 例えば二次元配列でいう test[0][1]に入っている(この例題では)1を取り出すには どのような記述になるのでしょうか? わかりにくい記述で申し訳ないですが、 ご存知の方、よろしくご教授ください。

専門家に質問してみよう