C ++传递动态分配的数组破坏堆

时间:2018-10-19 20:11:48

标签: c++ memory-management dynamic-memory-allocation

我有一个结构,可以容纳文件的句柄以及与文件标识有关的数据。

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()中提取出来?

0 个答案:

没有答案