C ++ Передача динамически распределяемой кучи разрушения массива - PullRequest
0 голосов
/ 19 октября 2018

У меня есть структура, которая содержит дескриптор файла, а также данные, которые относятся к его идентичности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...