1

私はVC ++で作業していますが、これは基本的なC ++の質問です...私はC ++を初めて使用し、Javaでの削除について心配する必要はありませんでした...とにかく、いくつかの調査の後、正しい方法を見つけたと思いますdetele を実行しますが、機能しません ... 関数でいくつかの一時的な 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」エラーが表示されます - プリントスクリーンを貼り付けます: エラー印刷画面

どこに問題があるのでしょうか?

ありがとうございました。


アップデート

エラーが発生する直前に、デバッガーのスクリーンショットを投稿しています。(変数 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 に答える