У меня проблемы с памятью. Я использую структуру следующим образом:
Файл package.h
#pragma once
#include <cstdlib>
struct Package {
char *data;
long long int *packageNumber;
long long int *allPackages;
Package(const int sizeOfData);
~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-й итерации цикла.
C
, когда очевидно, что вы используете C++. И если это это C++, почему бы не использоватьnew [ ]
иdelete[ ]
или просто контейнер, такой какstd::vector
? - person PaulMcKenzie   schedule 09.11.2015free
3 раза? Выполняется только один вызовmalloc
. - person PaulMcKenzie   schedule 09.11.2015malloc
нет никакой магии, в отличие от использованияnew char [ ]
илиstd::vector<char>
. Все они делают в основном одно и то же: выделяют непрерывный кусок памяти в байтах. Разница, по крайней мере, сmalloc
иstd::vector<char>
в том, что вам больше не нужно вручную управлять выделением и освобождением, из-за чего у вас сейчас ошибка. - person PaulMcKenzie   schedule 09.11.2015C
и пытаетесь смешать это с C++. Если вы собираетесь использоватьstd::vector
для хранения своих объектов, то вам нужно решить, хотите ли вы использовать стандартные контейнеры для своих элементов данных или использовать необработанную память и придерживаться правила 3, что вы хотите, это последнее, но ваш класс не может реализовать правило 3. - person PaulMcKenzie   schedule 09.11.2015