我在 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;
}
最佳答案
正如评论中所建议的,问题出在其他代码中,而不是删除节点。我没有调试代码,但正如评论者所建议的那样,我使用了 std::vector 而不是数组——首先检查 vector 的使用实际上与使用数组具有相同的效率。
关于C++ - 删除二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13478447/