私は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;
}