0

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 (およびそのオプション) に精通している人はいますか?

4

0 に答える 0