2012-11-20 154 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

我測試了一下,我提出的解決方案並不重要。 –