我有一个结构,可以容纳文件的句柄以及与文件标识有关的数据。
typedef struct {
char* fileName;
char* filePath;
char* fileType;
FileHeader header;
File* fileHandle; // Allows reading/ from the file
uint8_t* Read(uint32_t offset, uint32_t length) {
uint8_t* data = new uint8_t[length];
size_t bytes_read;
file->ReadBytes(data, length, offset, &bytes_read); // Reads the bytes at 'offset' in the file into the 'data' array
return data;
}
} FileInfo;
在各种静态函数中,我使用它来读取和返回有关任意文件的数据。一个例子是这样的:
bool Utility::ReadFileHeader(FileInfo* file) {
uint8_t* data = file->Read(0x0, 0x10);
auto header = &file->header;
header->byte_0 = data[0x0];
header->byte_1 = data[0x1];
...
header->byte_f = data[0xF];
delete[] data;
return true;
}
如示例中所示,我正在使用Read()
结构中定义的FileInfo
函数来读取文件数据。该数据存储在动态分配的数组中,当我完成数据处理后,将其删除以释放内存。
但是,这似乎正在破坏堆。使用该机制的几乎每个地方都容易崩溃,总是崩溃error c0000374
。
在需要数据的函数内部而不是结构的Read()
函数内部分配和删除数组似乎不会产生问题,但是在结构内部实现它的全部目的是:使代码更整洁,因为某些函数可以多次调用Read()
,从而导致大量缓冲区分配和删除。
如何解决这个问题,FileInfo->Read()
可以在提供安全的内存管理的同时从使用其功能的File->ReadBytes()
中提取出来?