0

私は 2 つの機能を持つ C++ Dll を作成しました。1 つはバイナリ ファイルをディスクに書き込み、もう 1 つはそのファイルをディスクから読み取り、メモリにロードします。

//extremely simplified code looks like this

bool Utilities::WriteToBinary(wstring const fileName)
    {
    //lot of code

    DWORD size = //get size of data to write
    LPBYTE * blob = new LPBYTE[size];
    WriteDataToMemoryBlob(blob, & size);

    FILE * pFile;
    if(0 != _wfopen_s (&pFile , fileName.c_str() , L"wb" ))
        {
        //do something
        return false;
        }

    fwrite (blob,  1, size , pFile );
    fclose (pFile);

    delete[] blob;
    return true;
    }

bool Utilities::ReadDataFromDisk(wstring const fileName)
    {    
    long fileSize = GetFileSize(fileName);
    FILE * filePointer;
    if(0 != _wfopen_s (&filePointer, fileName.c_str() , L"rb" ))
        return false;

    //read from file
    LPBYTE * blobRead = new LPBYTE[fileSize];
    fread (blobRead, 1, fileSize , filePointer );
    fclose (filePointer);

    //rest of the code...

問題 テストのためにこれらの DLL メソッドを呼び出す別の C++ プロジェクトを作成しました。

私を夢中にさせている問題は、同じプログラム内でWriteToBinaryReadDataFromDiskを連続して呼び出すと、完全に正常に動作することです。しかし、一度WriteToBinaryを呼び出し、プログラムを終了させて​​、次にReadDataFromDiskを呼び出し、以前にWriteToBinaryによって書き込まれたファイルのパスを指定すると、freadを実行した後にblobReadBadPtrが返されます。

共有または静的データ構造が含まれていないことを確認するために最善を尽くしました。どちらの方法も完全に独立しています。

何がこれを引き起こしているのでしょうか?

4

1 に答える 1

3

間違いは配列の割り当てですLPBYTEのでBYTE*、次のようになります。

LPBYTE * blobRead = new LPBYTE[fileSize];

BYTE*の配列ではなく、 の配列を割り当てていBYTEます。への変更:

BYTE* blobRead = new BYTE[fileSize];

std::vector<BYTE>動的割り当てを回避するには、代わりにa を使用できます。

std::vector<BYTE> blobRead(fileSize);
于 2013-01-12T09:03:04.033 に答える