0

我编写了一个具有两个功能的 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

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

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

4

1 回答 1

3

一个错误是数组的分配LPBYTEBYTE*这样的:

LPBYTE * blobRead = new LPBYTE[fileSize];

正在分配 的数组BYTE*,而不是 的数组BYTE。改成:

BYTE* blobRead = new BYTE[fileSize];

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

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