1

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

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;

运行程序后,我收到“检测到堆损坏”错误 - 粘贴打印屏幕: 错误打印屏幕

知道问题出在哪里吗?

谢谢你。


更新

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

调试器截图


更新

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

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

1 回答 1

0

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

于 2012-11-28T21:42:18.957 回答