2012-09-19 99 views
0

我很難找到這個內存泄漏。C++內存泄漏新增和刪除

我相信這是與盆地

int numbasinsx(int size, double *f) 
{ 
    int maxBasin, maxRelabel, bcnt; 
    unsigned int newgene; 
    int *basin, *relabel; 
    int relabelcnt; 

    // 
    // find the basins 
    // 
    maxBasin = 1<<size; 
    basin = new int [maxBasin]; 
    for (int gene=0; gene<maxBasin; gene++) basin[gene] = 0; 

    bool change = true; 
    bcnt = 0; 
    while (change) { 
     change = false; 

     for (int gene=0; gene<maxBasin; gene++) { 

      bool dominated = false; 
      for (int i=0; i<size; i++) {    // for all neighbors 
       newgene = gene^(1<<i);    // newgene is a neighbor 1 bit away 

       if (f[newgene] > f[gene]) dominated = true; // if neighbor is better mark it 

       if (basin[newgene]!=0) {          // something to copy 
        if (f[newgene] > f[gene]) {        // gene is dominated 
         if (basin[gene]==0 || basin[gene]<basin[newgene]) { // if not labeled or not lowest number 
          basin[gene] = basin[newgene];      // then label or relabel 
          change = true; 
         } 
        } 
        else if (f[newgene] == f[gene]) { 
         if (basin[gene]<basin[newgene]) { 
          basin[gene] = basin[newgene]; 
          change = true; 
         } 
        } 
       } 
      } 

      if (! dominated && basin[gene]==0) { 
//    printf("max: %d %lg\n", gene, f[gene]); 
       basin[gene] = ++bcnt; 
       change = true; 
      } 
     } 
    } 


    // 
    // relabel the basins 
    // 
    maxRelabel = maxBasin/2+1; 
    relabel = new int [maxRelabel]; 
    for (int gene=0; gene<maxRelabel; gene++) relabel[gene] = 0; 

    relabelcnt = 1; 
    for (int gene=0; gene<maxBasin; gene++) { 
     if (basin[gene]>=maxRelabel) printf("ERROR: trying to index %d into relabel array with max index of %d\n", basin[gene], maxRelabel-1); 

     if (relabel[basin[gene]]==0) { 
      relabel[basin[gene]] = relabelcnt++; 
     } 
//  printf("%d %lg %d\n", gene, f[gene], relabel[basin[gene]]); 
    } 
// printf("%d\n", relabelcnt-1); 

    delete basin; 
    delete relabel; 

    return relabelcnt-1; 
} 

我將離開上述起來,幫助他人,但與載體的新代碼現在是http://codepad.org/KiV85Brw。矢量運行時間比刪除[]版本慢得多,並且對於大量輸入甚至是殘段。我在做錯事

+4

爲什麼不使用矢量?沒有更多的內存泄漏! – chris

+1

使用delete []分配新的[] ... – fritzone

+1

[不匹配的標量和向量new和delete](http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660。 ASPX)。 – DCoder

回答

9

如果使用operator new[]分配一堆字節,那麼你必須使用operator delete[]摧毀他們:

basin = new int [maxBasin]; 
//..... 
delete[] basin; 

注意你與relabel做同樣的事情。

不管怎麼說,對於這種任務,你應該使用std::vector

std::vector<int> basin(maxBasin), relabel(maxRelabel); // We haz no leaks 
+0

爲向量歡呼! – xtofl

+0

真棒答案。它的工作,你給了我一個更好的解決方案!我現在正在使用矢量實現。 Muchas Gracias – SwimBikeRun

+0

@RunHard,你所需要做的就是改變聲明並去掉你所擁有的new []和delete。您不需要使用0填充它,因爲矢量默認爲初始化整數。 – chris

4

new[]必須跟着delete[],而不僅僅是delete。你的代碼釋放陣列basinrelabel都是錯誤的。

1

由於您正在分配數組,因此請使用delete [] basin;
delete運算符用於單個對象; delete []適用於多個對象(數組)。

1
basin = new int [maxBasin]; 

使用數組,你應該使用的operator delete []。請檢查relabel

它看起來像一個小的局部變量,你確定要使用動態分配嗎?爲什麼?如果你不得不嘗試unique_ptr。

3

basinrelable都是數組。當您使用運算符在堆上分配數組時,用於刪除數組的語法與用於刪除單個變量的語法有所不同。正確的語法是:

delete[] basin; 
delete[] relable; 

我相信你寫的代碼只會刪除每個數組的第一個元素。