Моя программа рушится, бросая ошибку повреждения кучи памяти. Проблемный кодовый блок описан ниже: проблема возникает при "delete [] p;" ниже для этого блочного кода необходимо изменить размер массива (элементы - определенные в заголовке класса). Для этого: 1. Я выделяю новый массив (копию) с новой соответствующей емкостью. 2. Я копирую старый массив (элементы) в новый (измененный) массив "copy". 3. Затем я пытаюсь удалить копию, поскольку она мне больше не нужна. Я, конечно, делаю ошибку в последнем пункте. Как это сделать правильно? - что означает, как освободить память, обработанную "копией", правильно избегая утечки памяти?
template <class Item> void MinPQ<Item>::resize(int capacity)
{
Item *copy = new Item[capacity];//capacity = stack size
for(int i = 0; i < N; ++i)
{
copy[i] = items[i];
}
Item *p = items;
items = copy;
delete[] p;
p = NULL;//avoid dangling pointer
}
Элемент определяется в классе следующим образом:
template <class Item> class MinPQ
{
private:
Item *items;
int queueSize;
int N;
void resize(int capacity);
bool greater(int i, int j);
void exch(int i, int j);
void swim(int k);
void sink(int k);
public:
MinPQ();
~MinPQ();
void insert(Item item);
Item delMin();
void print();
inline int size(){return N;}
inline bool isEmpty(){return N == 1;}
};
Конструктор и деструктор определены ниже:
template <class Item> MinPQ<Item>::MinPQ()
{
queueSize = 2;
N = 0;
items = new Item[queueSize];
}
template <class Item> MinPQ<Item>::~MinPQ()
{
delete [] items;
items = NULL;
}
Проблема, с которой я столкнулся, не была вызвана тем, что я не определил конструктор копирования, или я не перегрузил оператор =. Это было вызвано тем, что я обращался к неопределенному фрагменту памяти выделенного массива. Ясно: я определил массив из N элементов, но я использовал только N-10 из N. В какой-то момент в программе я делаю своп между некоторыми из определенных элементов N-10 и некоторыми неопределенными 10 элементами. Это ошибка, которая вызывает сбой. В любом случае, спасибо за ответы на мой вопрос.
Вероятно, ваша проблема связана с тем, что вы не определяете конструктор-копию или оператор-присваивание копиям и (где-нибудь) пытаетесь скопировать свою очередь. Это скопирует значения ваших указателей, но когда они выйдут из области действия, освободит память. Затем другая копия выходит из области действия и пытается освободить память, которая уже была освобождена.
Вы можете исправить это, следуя правилу 3
std::array
илиstd::vector
.queuesize
делает то , что я думаю , что это делает, вы должны установить егоcapacity
в этой функции.