当在一个新进程中完成时,fread给出BadPtr

fread gives BadPtr when done in a new process

本文关键字:完成时 fread BadPtr 给出 进程 新进程 一个      更新时间:2023-10-16

我写了一个c++ Dll,它有两个函数,一个将二进制文件写入磁盘,另一个从磁盘读取该文件并加载到内存中。

//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...

我创建了另一个c++项目,调用这些DLL方法进行测试。

让我疯狂的问题是,当我在同一个程序中连续调用WriteToBinaryReadDataFromDisk时,它们工作得很好。但是当我一次调用WriteToBinary并让程序退出并下次调用ReadDataFromDisk并给它早先由WriteToBinary写的文件的路径时,在执行fread之后,我在blobRead中得到BadPtr

我已经尽了最大的努力来确保不涉及共享或静态数据结构。两种方法是完全独立的。

你知道是什么原因造成的吗?

一个错误是将数组分配为LPBYTEBYTE*,因此:

LPBYTE * blobRead = new LPBYTE[fileSize];

分配的是BYTE*数组,而不是BYTE数组。改变:

BYTE* blobRead = new BYTE[fileSize];

要避免动态分配,您可以使用std::vector<BYTE>代替:

std::vector<BYTE> blobRead(fileSize);