копирование, а затем удаление динамического массива

0

Моя программа рушится, бросая ошибку повреждения кучи памяти. Проблемный кодовый блок описан ниже: проблема возникает при "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;
}
  • 3
    1. Ваш класс, кажется, нарушает правило трех. 2. Просто используйте std::array или std::vector .
  • 0
    Вы забыли дать нам код, который фактически вызывает функцию, которую вы показываете здесь. Однако, если queuesize делает то , что я думаю , что это делает, вы должны установить его capacity в этой функции.
Теги:

2 ответа

0
Лучший ответ

Проблема, с которой я столкнулся, не была вызвана тем, что я не определил конструктор копирования, или я не перегрузил оператор =. Это было вызвано тем, что я обращался к неопределенному фрагменту памяти выделенного массива. Ясно: я определил массив из N элементов, но я использовал только N-10 из N. В какой-то момент в программе я делаю своп между некоторыми из определенных элементов N-10 и некоторыми неопределенными 10 элементами. Это ошибка, которая вызывает сбой. В любом случае, спасибо за ответы на мой вопрос.

1

Вероятно, ваша проблема связана с тем, что вы не определяете конструктор-копию или оператор-присваивание копиям и (где-нибудь) пытаетесь скопировать свою очередь. Это скопирует значения ваших указателей, но когда они выйдут из области действия, освободит память. Затем другая копия выходит из области действия и пытается освободить память, которая уже была освобождена.

Вы можете исправить это, следуя правилу 3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню