我在 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;
}