C++ 删除数组指针C++;

C++ 删除数组指针C++;,c++,visual-studio-2010,visual-c++,heap,heap-memory,C++,Visual Studio 2010,Visual C++,Heap,Heap Memory,因此,我正在处理的有序列表类的Expand方法中出现了一个堆损坏错误。当客户机试图在列表中插入()一个新项,而数组中当前没有剩余空间时,将调用expand方法。当我取出删除行时,程序运行正常,但我知道每次扩展时都有一个无法访问的对象。但是,当我放入删除行时,程序会在运行时爆炸 此外,这只发生在我的Expand()方法中。它在my Contract()方法中没有这样做,每次从列表中删除列表元素时都会调用该方法,从而使列表元素的数量降低到当前可用总空间的1/4以下,它会将大小减半。我可以用这种方法删

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

此外,这只发生在我的Expand()方法中。它在my 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;
}
void OrdListClass::Expand()
{
ItemType*newList=新ItemType[大小*2];
ItemType*temp=GetListPtr();
尺寸=尺寸*2;
//将当前列表复制到新列表。
对于(int i=0;idelete temp;我假设您的列表分配了:

ItemType* newList = new ItemType[size * 2];
如果是这种情况,您需要执行以下操作:

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


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

是否使用了
GetLength()
大小
size
?此外,如果您使用
new[]
进行分配,则需要使用
delete[]
。如果不明显,
GetListPtr()
GetLength()
对于此功能的工作方式至关重要,如果说您决定不包含这些功能是……不方便的话,这是一种适度的轻描淡写。特别是考虑到忍者先生仍然没有回答的问题。很抱歉延迟了回复,我整晚都在编写此程序,在看到任何回复之前就睡着了。我n关于GetListPtr(),它与SetListPtr()和GetLength()一起从ListClass对象继承,ListClass对象以头文件和对象代码的形式提供给我,因此我不知道Get/SetListPtr()是如何工作的,但我知道GetLength()返回列表中当前的元素数。size变量保存数组的当前大小,或者它可以保存的最大元素数。例如,您不知道
SetListPtr
是否为您删除旧指针。似乎是时候与从中获取此代码的人谈谈了。谢谢,我实际上已经尝试了这两种方法er在我的Expand()方法中工作,但两者都在我的Contract()方法中工作。