当在一个新进程中完成时,fread给出BadPtr
fread gives BadPtr when done in a new process
我写了一个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方法进行测试。
让我疯狂的问题是,当我在同一个程序中连续调用WriteToBinary和ReadDataFromDisk时,它们工作得很好。但是当我一次调用WriteToBinary并让程序退出并下次调用ReadDataFromDisk并给它早先由WriteToBinary写的文件的路径时,在执行fread之后,我在blobRead中得到BadPtr。
我已经尽了最大的努力来确保不涉及共享或静态数据结构。两种方法是完全独立的。
你知道是什么原因造成的吗?
一个错误是将数组分配为LPBYTE
是BYTE*
,因此:
LPBYTE * blobRead = new LPBYTE[fileSize];
分配的是BYTE*
数组,而不是BYTE
数组。改变:
BYTE* blobRead = new BYTE[fileSize];
要避免动态分配,您可以使用std::vector<BYTE>
代替:
std::vector<BYTE> blobRead(fileSize);
相关文章:
- 选择排序时交换函数调用的数量和完成的交换次数是否相同?
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 当我使用c++生成器时,如何在输入完成后自动跳转到下一个"TEdit"
- 在可拆卸线程完成操作时取消分配内存
- 完成搜索任务时为空输出文件
- 当一个功能完成另一个功能打开时,我该怎么办?
- 我的循环未完成,当文件到达文件末尾时如何关闭它
- Bluez5:入口配对完成时的事件
- 恒定表达式在完成时起作用,而不是单个功能
- QProgressDialog栏在完成时重置为零
- 读取 ppm p6 图像完成时出现问题.C++
- 当类对象完成时,是否为 C++ 类的数据成员动态分配的内存会释放
- 在生产者完成时通知消费者的优雅方式
- Visual Studio 2015在构建完成时冻结
- 如何在工作线程完成时安全地终止它们?
- 只在前一个线程完成时创建一个新线程
- 当上一个槽已经写入并且还没有完成时,阻止一个槽执行一个方法
- 如何在字符串读取完成时停止c++的recv() ?
- 当子进程完成时调用函数
- 当在一个新进程中完成时,fread给出BadPtr