因此,我在正在处理的有序列表类的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;
}
再次感谢您阅读此内容,我们非常感谢您的所有帮助。
答案 0 :(得分:0)
我假设您的列表已分配:
ItemType* newList = new ItemType[size * 2];
如果是这种情况,您需要这样做:
delete[] temp;
使用new[]
分配的元素需要使用delete[]
删除。
http://www.cplusplus.com/reference/new/operator%20delete [] /