повреждение кучи при удалении указателя массива C ++

0

Таким образом, я получаю ошибку повреждения кучи в методе Expand для класса упорядоченного списка, над которым я работаю. Метод expand вызывается, когда клиент пытается вставить() новый элемент в список, и в данный момент в массиве нет места. Когда я беру строку удаления, программа работает нормально, но я знаю, что у меня есть недоступный объект каждый раз, когда он расширяется. Однако, когда я помещаю строку удаления, программа взрывается во время выполнения.

Кроме того, это происходит только в моем методе Expand(). Это не делает это в моем методе Contract(), который вызывается каждый раз, когда есть удаление из списка, которое приводит к тому, что количество элементов списка ниже 1/4 общего пространства, доступного в данный момент, оно уменьшает размер пополам. Я могу удалить старый список в этом методе без каких-либо проблем.

GetListPtr(), SetListPtr() и GetLength() наследуются от объекта ListClass, который я получил в виде файла заголовка и объектного кода, поэтому я не уверен точно, как они работают. ItemType - это структура, содержащая целое поле, ключ.

Я уже читал здесь несколько вопросов и не нашел ни одного, который, казалось бы, не помог бы в моей ситуации.

void OrdListClass::Expand()
{
    ItemType* newList = new ItemType[size * 2];
    ItemType* temp = GetListPtr();

    size = size * 2;

    // Copy the current list to the new list.
    for(int i = 0; i < GetLength(); i++)
        newList[i] = temp[i];

    // Point to the new list.
    SetListPtr(newList);

    // Delete the old list
    delete temp;  <-- This line

    // Reset the pointers
    temp = nullptr;
    newList = nullptr;
}


void OrdListClass::Contract()
{
    ItemType* newList = new ItemType[size / 2];
    ItemType* temp = GetListPtr();

    size = size / 2;

    // Copy the old list into the new one
    for(int i = 0; i < GetLength(); i++)
        newList[i] = temp[i];

    // Set the list pointer to point to the new list
    SetListPtr(newList);

    // Delete the old list
    delete temp;

    temp = nullptr;
    newList = nullptr;
}

Еще раз спасибо за это, всякая помощь приветствуется.

  • 1
    GetLength() ли GetLength() size вообще?
  • 1
    Также, если вы выделяете с помощью new[] вам нужно использовать delete[] .
Показать ещё 5 комментариев
Теги:
visual-c++
visual-studio-2010
heap
heap-memory

1 ответ

0

Я предполагаю, что ваш список был выделен:

ItemType* newList = new ItemType[size * 2];

Если это так, вам нужно сделать:

delete[] temp;

Элементы, выделенные new[], необходимо удалить с помощью delete[].

http://www.cplusplus.com/reference/new/operator%20delete[]/

  • 0
    Спасибо, я на самом деле пробовал оба, и ни один из них не работает в моем методе Expand (), но оба работают в моем методе Contract ().

Ещё вопросы

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