c++ - fread 在新进程中完成时给出 BadPtr

标签 c++ binary-data fread file-read

我写了一个 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);

关于c++ - fread 在新进程中完成时给出 BadPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291667/

相关文章:

c++ - 如何使用 Struct 打印我的交换函数

erlang - Erlang 中的二进制和位串有什么区别?

Windows 上的 c++ MIDI 音序器和 smf 加载器库

c++ - 仅使用绝对值对数组进行排序并在 C++ 中显示实际值

java - 为什么在以下代码中 Filter Servlet 中捕获二进制数据失败?

r - 获取分类数据频率矩阵的程序

c - 如何将二进制文件转换为字节?

R data.table fread select 与部分字符串匹配?

c - 我无法让 fread() 将文件内容打印到字符串变量

C++ [UDP] 如何跟踪服务器上所有已连接(客户端)的套接字连接?