2012-11-20 146 views
1

我正在使用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: Error Printscreen

任何想法,可能这个问题呢?

谢谢。


UPDATE

我张贴调试截图,happeng之前我得到的错误。 (变量a的真名是 “vkljucenost”:

Debugger Screenshot


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; 
} 
+12

我认为问题出在这两个'for'循环之间的''这里有一些代码''。评论该代码,然后运行。它会运行良好。无论如何,你应该使用'std :: vector >'。 – Nawaz

+1

使用调试器来隔离错误发生的线路。 – djechlin

+1

@Nawaz我们再次看到新手们只能张贴正确的代码。 – john

回答

0

正如评论中所建议的那样,问题出现在其他代码中,而不是删除节点。我没有调试代码,但是,正如评论者所建议的那样,使用std :: vector而不是数组 - 首先检查使用vector实际上与使用数组的效率相同。

-3

尝试在删除后将[i]设置为NULL。

for(int i = 0; i < (b/2); i++) { 
    // error happens here 
    delete[] a[i]; 
    a[i] = NULL; // added 
} 
delete[] a; 
+0

你可以用逻辑来支持它吗? –

+0

这会实现什么? –

+1

我测试了一下,我提出的解决方案并不重要。 –