C ++ - 删除2D数组

时间:2012-11-20 17:13:45

标签: c++ visual-c++

我在VC ++工作,但这是一个基本的C ++问题......我对C ++很新,从不担心用Java删除...无论如何,经过一些研究,我相信我已经找到了正确的做法,但不起作用......我在函数中使用了一些临时的2D数组,在结束函数之前,我需要删除它们。这是代码:

int** a;
a = new int*[b/2];
for(int i = 0; i < (b/2); i++)
{
    a[i] = new int[b];

}

    // some code here. Not changing the b variable!

for(int i = 0; i < (b/2); i++)
{
    // error happens here
    delete[] a[i];
}
delete[] a;

运行程序后,我收到“HEAP CORRUPTION DETECTED”错误 - 粘贴打印屏幕: Error Printscreen

知道问题在哪里?

谢谢。


更新

我发布调试器屏幕截图,就在我收到错误之前发生。 (变量a的真实姓名是“vkljucenost”:

Debugger Screenshot


更新

由于有些人要我发布更多代码,我发布了整个功能代码:

int** CVaja3KruskalView::CalcKruskal(EnosSez* seznam, int dimenzijaMatr)
{
    int** rezultat; // results array
    int stRezultatov = 0; // number of connections
    rezultat = new int*[dimenzijaMatr-1];
    for(int i = 0; i < (dimenzijaMatr-1); i++)
    {
        rezultat[i] = new int[2]; // shranjujem p in q
        rezultat[i][0] = -1;
        rezultat[i][1] = -1;
    }

    int** vkljucenost;
    int* dolzVkljuc = new int[dimenzijaMatr/2]; // last list elements
    vkljucenost = new int*[dimenzijaMatr/2];
    for(int i = 0; i < (dimenzijaMatr/2); i++)
    {
        vkljucenost[i] = new int[dimenzijaMatr];
        dolzVkljuc[i] = -1; // the i-list is empty
    }

    EnosSez* tmp = seznam;
    int pVkljuc;
    int qVkljuc;
    while(tmp!=NULL)
    {
        pVkljuc=Vkljuceno(vkljucenost, dolzVkljuc, tmp->p, dimenzijaMatr);
        qVkljuc=Vkljuceno(vkljucenost, dolzVkljuc, tmp->q, dimenzijaMatr);

        if(pVkljuc==qVkljuc && pVkljuc != -1) 
        {} else if (pVkljuc!=qVkljuc && pVkljuc != -1 && qVkljuc != -1) 
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            int prvi = min(pVkljuc,qVkljuc);
            int drugi = max(pVkljuc,qVkljuc);
            // prestavimo drugi seznam v prvega (seznama združimo)
            for(int i = 0; i <= dolzVkljuc[drugi]; i++)
            {
                vkljucenost[prvi][dolzVkljuc[prvi]] = vkljucenost[drugi][i];
                dolzVkljuc[prvi]++;
            }
            dolzVkljuc[drugi] = -1; // spraznemo drugi seznam
        } else if((pVkljuc != -1 && qVkljuc == -1) || (pVkljuc == -1 && qVkljuc != -1)) 
        {
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            if(pVkljuc == -1)
            {
                vkljucenost[qVkljuc][dolzVkljuc[qVkljuc]] = tmp->p;
                dolzVkljuc[qVkljuc]++;
            } else
            {
                vkljucenost[pVkljuc][dolzVkljuc[pVkljuc]] = tmp->q;
                dolzVkljuc[pVkljuc]++;
            }
        } else 
        {
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            int prviPrazen = 0; 
            while(dolzVkljuc[prviPrazen] > -1)
            {
                prviPrazen++;
            }
            dolzVkljuc[prviPrazen] = 2;
            vkljucenost[prviPrazen][0]=tmp->p;
            vkljucenost[prviPrazen][1]=tmp->q;
        }


        tmp=tmp->next;
    }

    //destruction
    delete[] dolzVkljuc;
    for(int i = 0; i < (dimenzijaMatr/2); i++)
    {
        // error happening here!!!
        delete[] vkljucenost[i];
    }
    delete[] vkljucenost;

    return rezultat;
}

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的,问题出在其他代码中,而不是删除节点。我没有调试代码,但是,正如评论者建议的那样,使用std :: vector而不是数组 - 首先检查vector的使用实际上与使用数组的效率相同。