У меня есть структура, которая содержит дескриптор файла, а также данные, которые относятся к его идентичности.
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()
от функций, которые его используют, обеспечивая безопасное управление памятью?