Таким образом, я получаю ошибку повреждения кучи в методе 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;
}
Еще раз спасибо за это, всякая помощь приветствуется.
Я предполагаю, что ваш список был выделен:
ItemType* newList = new ItemType[size * 2];
Если это так, вам нужно сделать:
delete[] temp;
Элементы, выделенные new[]
, необходимо удалить с помощью delete[]
.
http://www.cplusplus.com/reference/new/operator%20delete[]/
GetLength()
лиGetLength()
size
вообще?new[]
вам нужно использоватьdelete[]
.