• ベストアンサー

メモリ確保できない

http://okwave.jp/qa2481659.html の続きのようなものです。 フリー版VC++2005でゲームを作成しています。 特定の自作クラスの分のメモリ確保をしようとすると必ず失敗します。 そのクラスは数十バイト程度の大きさしかなく、継承や演算子上書きは使用していません。コンストラクタは使用していません。特に怪しい部分が見つけられません。しかし、newすればbad_allocとなり、mallocを使えばNULLを返します。 OSはWindowsXpです。irrlicht 1.1という3Dライブラリを使用していますのでこれが何か影響している可能性はあります。 この現象の原因と解決方法をお願いします。

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

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

確かに、見た感じではおかしいところはないですね。 一番可能性として考えられるのは、どこかでヒープを破壊しているのではないかということです。 その場合、同じ場所で、malloc(60)とか、場合によってはmalloc(1)を呼び出しただけでNULLを返すかもしれません。デバッグヒープを使うなどして追跡した方がよいと思います。

k_ppm
質問者

お礼

int a[16]; memset(a, 0, 256); のようなことやっていました。 指摘されたとおりヒープを破壊していました。 ありがとうございました。

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

その他の回答 (1)

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

その自作クラスのクラス指定子を見ないと正確なことは分かりません。 最低限、sizeof(その自作クラス)の評価結果を補足してください。

k_ppm
質問者

補足

補足します。 メンバ変数の型はirrlichtライブラリで定義されているものがほとんどです。 以下のようなクラスでsizeof(MyClass)は60です。 class MyClass { public: static MyClass** Handle; static INT32* Index; INT32 ID; vector3df* Pos; vector3df Vec; vector3df Rot; IAnimatedMesh* Mesh; IAnimatedMeshSceneNode* Node; ISceneNodeAnimatorCollisionResponse* Animator; ISceneNode* Target; UINT32 Time; UINT32 LastTime; INT32 LastState; ~MyClass(); void Function(void); static void Initialize(void); static void Finalize(void); static MyClass* Create(void); static void Release(MyClass* p); }; また、PCを代えると突然動き出しました。 しかし、こちらのPCでも同じようなこと(最上記URLの質問)があったので奇跡的なバランスではないかと考えています。

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

関連するQ&A

  • 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点について、ご教授下さい。よろしくお願い致します。

  • 構造体のメンバのメモリ確保について

    構造体の中の一部のメンバだけをmalloc関数で メモリ確保したいのですがどのように宣言すればよいのでしょうか? vc++6.0を使用しています。 初歩的な質問ですみませんがお願いします。

  • コンストラクタでnewを失敗した場合の対応について

    よろしくお願いします。 クラスのメンバで3つのlongのポインタを宣言し、 コンストラクタ内でそれぞれにnewして領域を確保 しています。 質問1)newを失敗した場合には、そのポインタに     対してdeleteしてはいけないのでしょうか? 質問2)上記3つもエリアの確保のうち、2つめで失    敗した場合、1つ目のdeleteをしてやる     必要はあるのでしょうか? catch(bad_alloc)でその処理をしようとおもうのですが、そもそもコンストラクタで例外を発生させるなと かかれている書籍もあるようです。ただ、すでにそういう記載になってしまっており、できれば、いまの構造でメモリーリークを防げないかと思案しております。どなたか、よい方法をご存知の方いらっしゃいましたら、アドバイスいただけましたら幸いでございます。

  • C++のnewで確保した領域について

    こんにちわ。C++を勉強し始めた者です。 new演算子を使ってインスタンスを生成した場合、それはスタックではなくヒープ領域に確保され、不要になったらdeleteを使って領域を解放しなければいけない認識です。 C++の初心者向けサンプルコードを見ていて疑問があったので質問させてください。 (例)クラスA.cpp ======================== #include <Car> #include <Garage> ~略~ クラスAのコンストラクタ{ Car *mycar = new Car("プリウス"); addGarage( mycar ); } クラスAのデストラクタ{ } ======================== 上記のような実装のクラスAがあったのですが、コンストラクタでCarクラスのインスタンス生成をして、オート変数の*mycarに格納して、Garageの公開関数に渡しています。 質問1:このクラスAをインスタンス生成した場合、コンストラクタで確保したヒープ領域は、プログラム終了時まで解放されない認識であっていますか? 質問2:オート変数の*mycarはコンストラクタからreturnした時点で解放されてしまうので、今のままではデストラクタでヒープ領域をdeleteできない認識であっていますか? 質問3:newで生成したインスタンスへのポインタは、その関数内でdeleteしない場合、メンバ変数やstatic変数、グローバル変数に格納しなければdeleteできなくなるという理解であっていますか? 質問4:C++のコードでnewした戻り値をオート変数に格納するプログラムは通常使うことはあるのですか?

  • C言語 動的なメモリの確保 実行できない

    malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int i;   char *C;   C = (char *) malloc (sizeof(char) * 5);   C = "ABCD";   for(i = 0; i < 5; i++){     if(C[i] != NULL){       printf("%s", C[i]);    ←※エラー※     }   }   free(C);   return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?

  • new領域確保について

    お世話になります new演算子の使用方法について教えてください。 new演算子は、動的確保を行なう際に使用する事は知っております。 もう1つの使用理由として、関数内のローカル変数領域が多大になる場合に 使用すると聞いた事があります これは、スタック領域を圧迫しないためと説明を受けた記憶があります これがあってるとしたら、どれくらいの変数容量を宣言する際に、new演算子を使用するのでしょうか? よろしくお願い致します

  • C++のnewの使い道

    最近C++を勉強しているのですが、new演算子はどういうときに使うべきでしょうか? メモリを動的確保できるのはわかります。 Cのmallocのようなものと考えていいのでしょうか? つまり、関数内でメモリを確保してそのアドレスを返すとか、コンパイル時に不明なサイズのメモリを実行時に確保するとか、任意のタイミングでメモリを開放したい場合などに使うものでしょうか。 ある参考書を読んでいると「引数つきコンストラクタを呼び出す場合はnewでインスタンス生成する」と書いてありました。 デフォルトコントラスタならnewなし、引数付きならnewあり、ということらしいです。 なぜこんなことをする必要があるのでしょうか?

  • 動的確保できるメモリ容量

    こんにちは. 2個のファイルを同時に開いて処理するプログラムを作成したところ, メモリの確保に失敗するエラー(std::bad_alloc)が発生してしまいます. *********************** 環境 OS:WindowsXP-sp2 メモリ:768 MB HD空き:約30GB 開発環境:C++Builder 6 *********************** 開こうとするファイルは,各250MB程度で,それぞれを読み込んだ後,それ ぞれに対して同じ大きさの配列を確保するため,必要メモリ容量は, 約 1GB 程度になります. ちなみに,配列の確保はnewを用いています. PCに搭載している物理メモリが768MBなので,仮想メモリにアクセスする のは当然だと思います.ただ,ハードディスクの空きも十分なので,実行 速度が遅くなったとしても,無事処理できると思っていました. ヒープサイズが関係していると思い,C++Builderのリンカの設定で予約ヒー プサイズを最大に設定しましたがダメでした. また,Windowsのシステムのプロパティで,仮想メモリを4000MBにしました がこれもダメでした. プログラムで一度に確保できるメモリサイズには限界があり,それ以上の サイズを確保することは不可能なのでしょうか? なお,2つのファイルを同時に開いて処理しようとするとエラーになって しまいますが,作成したソフトを2つ実行して,それぞれで上記ファイルを 1つずつ開くと,合計の必要メモリは同じにもかかわらず,エラーになりま せん. このときタスクマネージャでPF使用量を確認すると,1.2GBになっていました. 分かりづらい文章で大変申し訳ありませんでした. 何かアドバイスいただければありがたいです.

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }

  • new演算子と初期化子 { } の違いについて教えて下さい

    演算子と初期化子 { } の違いがわからなくて調べています。 // newを使った配列 int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; // { } を使った配列 int[] a = { 1, 2, 3 }; /* 上記の例は配列ですが、 例えば、配列ではない、Kamokuというクラスを作ったときに、 { } でコンストラクタを使用して、インスタンスを作ることは不可能ですか?メモリは確保しないのでしょうか?

    • ベストアンサー
    • Java
このQ&Aのポイント
  • アンドロイドのスマホから、プリンターでスキャンしたものをメールに添付して送りたいため、mobile connectをインストールし製品情報を登録したが、iprint&scanでできると出てきたので、あらかじめインストールしてあったiprint&scanでスキャンをし、pdf形式で保存を選んだが、保存先を指定するか場面がなく、保存ボタンを押したが、スマホのどこにデータが保存されているのかわからない。
  • モバイル to アプリという機能のこともよくわかりません。
  • 質問された方が、モバイル to アプリという機能でないとスマホに直接保存できないようだと書かれていました。
回答を見る