プロが教える店舗&オフィスのセキュリティ対策術

現在VC++で3Dゲームのプログラムを作成中なのですが、プログラムの一番最初の部分で、ある関数を呼び出し内部で構造体を宣言、
その後にnewでメモリ動的確保を行うとNULLが返るようになってしまいました。

関数のソースはこんな感じです↓。

LPOBJLoadObj( LPSTR filename )
{
     LPOBJlpObj;// LPOBJはOBJ構造体のポインタです

     //構造体メモリ確保
     lpObj = new OBJ;//  この時点で失敗してNULLが返る

     //
     // いろいろと処理
     //

     return lpObj;
}

↑この関数の戻り値をクラスのコンストラクタでメンバ変数にセットしています。

先日プログラムを動かしている時に急にこの状態(newでNULLが返る)になり、それ以来ずっとこの調子です。
(現在は)メモリーリークは起こしていません。(少し前までは大量に起こしていました)

この状態になるともうメモリの動的確保はできないのでしょうか?

A 回答 (3件)

>(現在は)メモリーリークは起こしていません。

(少し前までは大量に起こしていました)
はかなり気になるので、メモリリーク等の簡単な確認方法だけ(XPの場合)。

タスクマネージャの「プロセス」タブを開き、
「メニュー」→「プロセス」→「列の選択」を選択。
この中の項目の、
・メモリ使用量
・スレッドの数
・ハンドルの数
にチェックを入れる(他も監視が必要な場合もあるが、大抵はこれだけでOK)

「プロセス」タブを表示したままプログラムを実行し、上記の値(特にスレッドやハンドル)が過剰な値を示していないか確認する。
特に、リアルタイム処理で解放せずに使用していたりする場合には時間の経過と共に増えていく場合が多いので発見しやすい。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

こんな確認方法もあるのですね。
試してみたところ、問題部分周辺には特におかしなところはありませんでした。

お礼日時:2008/08/20 00:28

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のものを使っています。

補足日時:2008/08/19 00:33
    • good
    • 1
この回答へのお礼

御回答ありがとうございました。
お礼が遅れてしまって申し訳ありません。

お礼日時:2008/09/14 11:03

情報が少ないのでなんとも言えませんが。



1.
LPOBJ LoadObj( LPSTR filename )
から推測すると、以前より大きなファイルを開いたりしてませんか?

2.
メモリリークを起こしてないと言い切れる理由はなんでしょう?
もう一度見直してみたほうがいいかも。
LoadObjで生成したオブジェクトは管理していますよね?
そのサイズの合計がどのくらいになっているかもチェックしてみるといいかもしれません。


あとは、ほかの方はおまかせします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

1.
まったく同じファイルです。

2.
ご指摘通りもう一度見直してみます。

お礼日時:2008/08/19 01:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!