Application Verifier (10.0,x64) を使用して潜在的なメモリの問題をデバッグし始めたばかりですが、以前は問題にならなかった奇妙な問題がいくつか発生しています。
たとえば、MapViewOfFile()
400KB 未満のファイルを呼び出すと8
、戻り値 が返されますERROR_NOT_ENOUGH_MEMORY
。エラーをスローする特定のファイルがランダムに変化するように見え、エラーがまったくスローされない場合もあります。Application Verifier オプションを下のHEAP
チェックボックスに絞り込みましたBASIC
。エラーをスローするには、このオプションを有効にする必要があります。Application Verifier を使用する前に、この関連コードで問題が発生したことはありません。
これは私のコードのどこかに問題があることを示していますか、それともある種の非互換性ですか? それが私が答えようとしている質問です。
これが私の機能です。この小さな断片では詳細がわかりませんので、具体的な内容を見たい場合はお知らせください。この関数は、ファイル全体をマップするためにのみ使用します。これまでのところ、エラーをスローしているファイルはすべてテクスチャ PNG 画像です。これは、他のすべてのファイルが比較して小さいためと考えられます。
Bool streamMap::OpenHandles() // Opens file handles
{
// verify
_VE( FilePtr == null && Offset == 0 && HXFile == INVALID_HANDLE_VALUE, "Invalid starting state. File may already be open. Cannot open another file with the same file interface object" );
// create the File handle
// + note: CreateFile macro is undefined by Kestarda, so we use actual function CreateFileA
HXFile = CreateFileA( FullPath,
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
null, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
null); // no attribute template
// check for failure
if( HXFile == INVALID_HANDLE_VALUE )
return false;
// create Mapping
// + we use 0 for dwMaximumSizeHigh & dwMaximumSizeLow to specify the entire file (supplied by HXFile)
HXMap = CreateFileMapping( HXFile, 0, PAGE_READONLY, 0, 0, null );
if( HXMap == null )
{
// close the file handle and return false
CloseHandle( HXFile );
HXFile = INVALID_HANDLE_VALUE;
return false;
}
// get map view of file
FilePtr = reinterpret_cast<byte*>( MapViewOfFile( HXMap, FILE_MAP_READ,0,0,0 ) );
if( FilePtr == null )
{
// close both handles and return false
CloseHandle(HXMap);
CloseHandle(HXFile);
HXMap = null;
HXFile = INVALID_HANDLE_VALUE;
return false;
}
// success
return true;
}
HEAP
なぜこれが起こっているのかを理解するのに役立つ、Application Verifier (およびそのオプション) に精通している人はいますか?