У меня проблемы с памятью. Я использую-структуру таким образом:Ошибка 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);
}
после конца скобки оно проливает error: "HEAP[zad2.exe]: Invalid address specified to RtlValidateHeap(00000056FEFE0000, 00000056FEFF3B20)"
Я понятия не имею, что я делаю неправильно. Пожалуйста, помогите, Майкл.
EDIT: теперь он работает для первой итерации цикла. Помогает, что я изменил деструктор к этому:
Package::~Package() {
free(packageNumber);
}
Но теперь деструктора выполняется два времени на одном объекте STRUCT в 2'nd итерации цикла.
Зачем отмечать это как 'C', когда очевидно, что вы используете C++. И если это * есть * C++, почему бы не использовать 'new []' и 'delete []' или просто контейнер, такой как 'std :: vector'? – PaulMcKenzie
Почему вы называете 'free' 3 раза? Существует только один вызов 'malloc'. – PaulMcKenzie
Becouse Я должен сделать это в фрагменте непрерывной памяти. Целая структура должна быть в одном месте. – PianistaMichal