Ошибка HEAP Недопустимый адрес, указанный для RtlValidateHeap

У меня проблемы с памятью. Я использую структуру таким образом:

Файл Package.h

#pragma once
#include <cstdlib>

struct Package {
char *data;
long long int *packageNumber;
long long int *allPackages;

Package(const int sizeOfData);
~Package();
};

Package.cpp

#include "Package.h"
Package::Package(const int sizeOfData) {
void *ptr = malloc(2 * sizeof(long long int) + sizeOfData * sizeof(char));
packageNumber = (long long int*) ptr;
allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int));
data = (char*)((char*)ptr + 2 * sizeof(long long int));
}

Package::~Package() {
free(data);
free(packageNumber);
free(allPackages);
}

И в методе:

for (int j = 0; j < this->bufforSize || i * bufforSize + j < allPackages; j++) {
Package package(this->packageSize);
this->file->read(package.data, this->packageSize);
*package.allPackages = allPackages;
*package.packageNumber = i * this->bufforSize + j;
this->dataPacked->push_back(package);
}

после окончания скобок выдает ошибку: "HEAP[zad2.exe]: Invalid address specified to RtlValidateHeap( 00000056FEFE0000, 00000056FEFF3B20 )"
Понятия не имею, что я делаю не так. Пожалуйста, помогите, Майкл.

РЕДАКТИРОВАТЬ: Теперь это работает для первой итерации цикла. Помогает, что я изменил деструктор на это:

Package::~Package() {
free(packageNumber);
}

Но теперь деструктор выполняется два раза на одном и том же объекте структуры во 2-й итерации цикла.

0

Решение

Прочитайте описание из free:

Поведение не определено, если значение ptr не равно значению, возвращенному ранее std :: malloc (), std :: calloc () или std :: realloc ().

Затем посмотрите на свой код, обратите внимание на комментарии, которые я добавил.

void *ptr = malloc(2 * sizeof(long long int) + sizeOfData * sizeof(char));
packageNumber = (long long int*) ptr; // you got this from malloc
allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int)); // the value of this pointer is not equal to anything returned by malloc
data = (char*)((char*)ptr + 2 * sizeof(long long int)); // the value of this pointer is not equal to anything returned by malloc either

И наконец в деструкторе

free(data); // was not allocated with malloc -> undefined behaviour
free(packageNumber); // was allocated with malloc -> OK
free(allPackages); // was not allocated with malloc -> undefined behaviour

Вы пытаетесь удалить указатели, которые вы не получили от malloc, Это приводит к неопределенному поведению. Ошибка связана с неопределенным поведением. Вы понимаете, что free(packageNumber) освобождает весь блок памяти, выделенный malloc, Это включает в себя память, указанную data а также allPackages,

Существует простое правило: Call free ровно один раз за каждый звонок malloc/calloc, То же относится и к delete+new а также delete[]+new[],

3

Другие решения

allPackages = (long long int*) ((long long int*)ptr + sizeof(long long int));

Когда вы используете длинный длинный указатель int (в нашем случае это ptr после приведения) и хотите увеличить размер байта sizeof (long long int), вам просто нужно сделать ptr ++;

Но я предлагаю вам переписать ваш код и использовать 3 malloc вместо одного.

0

По вопросам рекламы [email protected]