2014-02-11 3 views
2

Так что я пытаюсь создать класс шаблона для кучи. Я стараюсь не использовать какие-либо классы STL (правила профессора и многое другое), поэтому вместо использования вектора я использую динамически выделенный массив. Однако, когда я запускаю программу и вводят достаточно данных в кучу, чтобы она вызывала функцию изменения размера, она вызывает кучу ошибок памяти. Некоторые работы gdb сузились до этой функции:Ошибки памяти в размере массива

template <class T> 
T* Heap<T>::resize() 
{ 
    T* temp; //temp variable for storage 

    heap_capacity *= 2; //double capacity 
    temp = new T[heap_capacity]; //create new enlarged array 
    for (int i = 0; i < heap_size; ++i) 
    { 
     temp[i] = heap_arr[i]; //copy elements from previous array to current 
    } 
    delete [] heap_arr; //delete old array 
    return temp; //return new array 
} 

Pretty standard stuff, tbh. Он требует, чтобы у T был оператор присваивания, но я тестировал его с использованием простых старых целых чисел. Это не первый раз, когда я написал этот код, но это первый раз, когда я написал его для шаблона. Проблема в этой функции, или это где-то еще?

Редактировать: Я играл с кодом немного больше в gdb. Выключает ошибки программы сразу после выделения памяти для темпа. Это странно, потому что я делаю то же самое для оригинального heap_array в конструкторе. Я буду ковать немного больше, но мой синтаксис неверен для «нового» утверждения? heap_capacity действительно, btw, так что это не проблема ...

+0

Возможно, heap_size больше, чем heap_capacity. –

+1

Каковы конкретные ошибки, которые вы получаете? – Barmar

+0

Я рекомендую вам сначала написать свой (минимальный) клон 'std :: vector', отладить его со многими тестовыми примерами, а затем написать класс кучи поверх него. Это связано с тем, что ваша ошибка больше связана с «дизайном программы», чем с классом «алгоритм и структура данных», который вы посещаете. Вы должны были поймать ошибку в вашем методе 'resize()' (без параметра 'size'!), Если бы вы следовали этому подходу. – nodakai

ответ

6

Похоже, вам нужно установить heap_arr, чтобы указать на новую расширенную память. Это, безусловно, имеет смысл для метода resize, чтобы заботиться об этом:

delete [] heap_arr; 
heap_arr = temp; 
return heap_arr; 

Вы также должны быть уверены, что heap_size меньше heap_capacity.

1

Ну, я выяснил, почему я получил ошибку. Выключает мой чек, чтобы увидеть, был ли размер кучи равным емкости, забыл важную часть: дополнительный 0 в верхней части массива. Куча основана на 1 (в отличие от 0), поэтому исправление было простым: измените оператор heap_size == heap_capacity на heap_size == heap_capacity-1 ... важное различие. Спасибо за вашу помощь.

+0

Вам не нужно исправление в ответе juanchopanza? – Barmar

+0

Это не было абсолютно необходимо, но я действительно реализовал слегка измененную версию исправления, да. –

Смежные вопросы