删除数组指针C ++时堆损坏

时间:2013-10-26 04:03:30

标签: c++ visual-studio-2010 visual-c++ heap heap-memory

因此,我在正在处理的有序列表类的Expand方法中遇到堆损坏错误。当客户端尝试将新项目Insert()到列表中时,将调用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;
}

再次感谢您阅读此内容,我们非常感谢您的所有帮助。

1 个答案:

答案 0 :(得分:0)

我假设您的列表已分配:

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

如果是这种情况,您需要这样做:

delete[] temp;

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

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