我正在使用VC++,但這是一個基本的C++問題...我用C++很新,從來不必擔心在Java中刪除......無論如何,經過一些研究,我相信我找到了正確的方法來做一個反抗,但不起作用......我在一個函數中使用了一些臨時的二維數組,並且在結束函數之前,我需要刪除它們。下面是代碼:C++ - 刪除二維數組
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;
運行PROGRAMM後,我得到「檢測堆損壞」錯誤 - 粘貼PRINTSCREEN:
任何想法,可能這個問題呢?
謝謝。
UPDATE
我張貼調試截圖,happeng之前我得到的錯誤。 (變量a的真名是 「vkljucenost」:
UPDATE
由於一些讓我張貼更多的代碼,我張貼的全功能代碼:
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;
}
我認爲問題出在這兩個'for'循環之間的''這裏有一些代碼''。評論該代碼,然後運行。它會運行良好。無論如何,你應該使用'std :: vector>'。 –
Nawaz
使用調試器來隔離錯誤發生的線路。 – djechlin
@Nawaz我們再次看到新手們只能張貼正確的代碼。 – john