0

因此,我正在处理的有序列表类的 Expand 方法中出现堆损坏错误。当客户端尝试将新项目插入()到列表中时调用 expand 方法,并且当前数组中没有剩余空间。当我取出删除行时,程序运行良好,但我知道每次扩展时我都有一个无法访问的对象。但是,当我放入删除行时,程序会在运行时爆炸。

此外,这只发生在我的 Expand() 方法中。它没有在我的 Contract() 方法中执行此操作,每次从列表中删除使列表元素的数量低于当前可用总空间的 1/4 时都会调用该方法,它将大小减少一半。我可以用这种方法删除旧列表而没有任何问题。

GetListPtr()、SetListPtr() 和 GetLength() 都继承自一个 ListClass 对象,我以头文件和对象代码的形式收到了该对象,因此我不确定它们究竟是如何工作的。ItemType 是一个结构体,只包含一个整数字段,key。

我已经在这里阅读了许多问题,但没有发现任何似乎对我的情况有任何帮助的问题。

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;
}

再次感谢您阅读本文,我们将不胜感激。

4

1 回答 1

1

我假设您的列表分配给:

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

如果是这种情况,您需要执行以下操作:

delete[] temp;

用 分配的元素new[],需要用 删除delete[]

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

于 2013-10-26T04:35:22.040 回答