現在VC++で3Dゲームのプログラムを作成中なのですが、プログラムの一番最初の部分で、ある関数を呼び出し内部で構造体を宣言、
その後にnewでメモリ動的確保を行うとNULLが返るようになってしまいました。
関数のソースはこんな感じです↓。
LPOBJLoadObj( LPSTR filename )
{
LPOBJlpObj;// LPOBJはOBJ構造体のポインタです
//構造体メモリ確保
lpObj = new OBJ;// この時点で失敗してNULLが返る
//
// いろいろと処理
//
return lpObj;
}
↑この関数の戻り値をクラスのコンストラクタでメンバ変数にセットしています。
先日プログラムを動かしている時に急にこの状態(newでNULLが返る)になり、それ以来ずっとこの調子です。
(現在は)メモリーリークは起こしていません。(少し前までは大量に起こしていました)
この状態になるともうメモリの動的確保はできないのでしょうか?
No.3ベストアンサー
- 回答日時:
>(現在は)メモリーリークは起こしていません。
(少し前までは大量に起こしていました)はかなり気になるので、メモリリーク等の簡単な確認方法だけ(XPの場合)。
タスクマネージャの「プロセス」タブを開き、
「メニュー」→「プロセス」→「列の選択」を選択。
この中の項目の、
・メモリ使用量
・スレッドの数
・ハンドルの数
にチェックを入れる(他も監視が必要な場合もあるが、大抵はこれだけでOK)
「プロセス」タブを表示したままプログラムを実行し、上記の値(特にスレッドやハンドル)が過剰な値を示していないか確認する。
特に、リアルタイム処理で解放せずに使用していたりする場合には時間の経過と共に増えていく場合が多いので発見しやすい。
御回答ありがとうございます。
こんな確認方法もあるのですね。
試してみたところ、問題部分周辺には特におかしなところはありませんでした。
No.2
- 回答日時:
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のものを使っています。
No.1
- 回答日時:
情報が少ないのでなんとも言えませんが。
。1.
LPOBJ LoadObj( LPSTR filename )
から推測すると、以前より大きなファイルを開いたりしてませんか?
2.
メモリリークを起こしてないと言い切れる理由はなんでしょう?
もう一度見直してみたほうがいいかも。
LoadObjで生成したオブジェクトは管理していますよね?
そのサイズの合計がどのくらいになっているかもチェックしてみるといいかもしれません。
あとは、ほかの方はおまかせします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
ファイルマッピング関数で失敗
-
VB.netでUSBメモリの固有I...
-
ファミコンって8ビットしかない...
-
C言語における再帰呼び出しの...
-
C#のOutOfMemoryException発生...
-
ExcelのVBAでメモリ解放できない
-
大容量のメモリ確保をスワップ...
-
C#で別クラスインスタンスのメ...
-
ReadEventLogについて
-
シェル(perl)が使用するメモリ...
-
メモリの増加に関して
-
メモリアクセス時間の計測方法
-
メモリを解放しないとどうなる?
-
プログラム領域の算出方法
-
mallocとfree
-
DalvikとJVM
-
動的メモリとexit(C言語)
-
動的確保できるメモリ容量
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
エクセルVBA 大容量CSVファイル...
-
EXCEL-VBAにてADOのレコードセ...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
メモリのセグメント違反の解決...
-
メモリが不足しています(VBA)
-
【C言語】再帰が時間がかかる...
-
ファイルマッピング関数で失敗
-
C言語:関数のメモリ上でのサイ...
-
メモリの解放の仕方
-
VC++におけるメモリ使用量について
-
メモリの消費量について
-
Bitmapを重ね合わせる方法
-
メモリを解放しないとどうなる?
-
C#のOutOfMemoryException発生...
-
メモリの解放について VB6 VBA
おすすめ情報