- ベストアンサー
VC++のnewでNULLが返る
現在VC++で3Dゲームのプログラムを作成中なのですが、プログラムの一番最初の部分で、ある関数を呼び出し内部で構造体を宣言、 その後にnewでメモリ動的確保を行うとNULLが返るようになってしまいました。 関数のソースはこんな感じです↓。 LPOBJ LoadObj( LPSTR filename ) { LPOBJ lpObj;// LPOBJはOBJ構造体のポインタです // 構造体メモリ確保 lpObj = new OBJ;// この時点で失敗してNULLが返る // // いろいろと処理 // return lpObj; } ↑この関数の戻り値をクラスのコンストラクタでメンバ変数にセットしています。 先日プログラムを動かしている時に急にこの状態(newでNULLが返る)になり、それ以来ずっとこの調子です。 (現在は)メモリーリークは起こしていません。(少し前までは大量に起こしていました) この状態になるともうメモリの動的確保はできないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>(現在は)メモリーリークは起こしていません。(少し前までは大量に起こしていました) はかなり気になるので、メモリリーク等の簡単な確認方法だけ(XPの場合)。 タスクマネージャの「プロセス」タブを開き、 「メニュー」→「プロセス」→「列の選択」を選択。 この中の項目の、 ・メモリ使用量 ・スレッドの数 ・ハンドルの数 にチェックを入れる(他も監視が必要な場合もあるが、大抵はこれだけでOK) 「プロセス」タブを表示したままプログラムを実行し、上記の値(特にスレッドやハンドル)が過剰な値を示していないか確認する。 特に、リアルタイム処理で解放せずに使用していたりする場合には時間の経過と共に増えていく場合が多いので発見しやすい。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
VC++のバージョンが不明なので何とも言えませんが... > lpObj = new OBJ; がNULLを返すとすれば、OBJ構造体でoperator newを多重定義している以外には普通は考えられません(かなり古いVC++なら話は別)。 struct OBJ { void* operator new(std::size_t) throw() { return NULL; } }; のようなことをやっていませんか?
お礼
御回答ありがとうございました。 お礼が遅れてしまって申し訳ありません。
補足
素早い回答ありがとうございます。 newに関しては↓のようなメモリーリーク検出用のヘッダーファイルの中でしか手をつけておりません。 #ifndef MEMORY_LEAK_H #define MEMORY_LEAK_H #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__)// ここ #endif #endif これをすべてのcppファイルにインクルードすることでメモリリークを探していたのですが、問題の関数が書かれたcppでは 上に書いたヘッダーファイルをインクルードしていない場合でもnewの戻り値はNULLでした。 VC++は2005のAcademicEditionのものを使っています。
- takoashi
- ベストアンサー率39% (21/53)
情報が少ないのでなんとも言えませんが。。 1. LPOBJ LoadObj( LPSTR filename ) から推測すると、以前より大きなファイルを開いたりしてませんか? 2. メモリリークを起こしてないと言い切れる理由はなんでしょう? もう一度見直してみたほうがいいかも。 LoadObjで生成したオブジェクトは管理していますよね? そのサイズの合計がどのくらいになっているかもチェックしてみるといいかもしれません。 あとは、ほかの方はおまかせします。
お礼
回答ありがとうございます。 1. まったく同じファイルです。 2. ご指摘通りもう一度見直してみます。
お礼
御回答ありがとうございます。 こんな確認方法もあるのですね。 試してみたところ、問題部分周辺には特におかしなところはありませんでした。