2013-07-19 60 views
0

當我在釋放模式下運行時,我調用malloc()我的程序在第7行崩潰了,我得到`Program.exe已停止工作消息,當我運行在調試器,大部分時間它成功,但有時我得到這個消息(特別是在較大的輸入): crash函數在釋放模式下崩潰,但在調試器中運行完美

MONOM* polynomialsProduct(MONOM* poly1, int size1, MONOM* poly2, int size2, int* productSize) 
{ 
    int i1, i2; 
    int phSize = 1, logSize = 0; 
    MONOM* product; 

    product = (MONOM*)malloc(phSize*sizeof(MONOM)); 
    monomAllocationVerification(product); 

    for (i1 = 0; i1 < size1; i1++) 
    { 
     for (i2 = 0; i2 < size2; i2++) 
     { 
      if (logSize == phSize) 
      { 
       phSize *= 2; 
       product = (MONOM*)realloc(product,phSize*sizeof(MONOM)); 
       monomAllocationVerification(product); 
      } 

      product[logSize].coefficient = poly1[i1].coefficient * poly2[i2].coefficient; 
      product[logSize].power = poly1[i1].power + poly2[i2].power; 
      logSize++; 
     } 
    } 

    mergeSort(product,logSize); 
    *productSize = sumMonomsWithSamePower(product, logSize); 

    return product; 
} 

我明白,我處理內存錯誤和問題,但有任何快速分析我的代碼並查找內存錯誤的方法?我看着我的代碼十幾次尋找這種錯誤,一無所獲。 (我不想在這裏發佈代碼,因爲它的長度爲420行)。

+0

那麼,調試時崩潰時的phSize是什麼? –

+1

當你的程序在一個malloc上崩潰時,特別是如果它是'有時'崩潰,真正的錯誤在程序執行的早期。這是第一次調用malloc嗎? – Fred

+0

@意義問題,'phSize = 1' – Quaker

回答

1

首先,如果在第一malloc檢測堆損壞,這意味着它較早(在此函數或以前通)發生。所以問題可能在於此代碼之外。

但是,代碼對我來說也很可疑。

  1. monomAllocationVerification沒有size參數,所以應該在一個monom只有工作,但你儘管有相當一些monoms分配空間realloc上指向第一個元素,之後只有一次調用它。請澄清你的決定。

  2. 有點不清楚爲什麼sumMonomsWithSamePower應該返回一個大小,從而修改一個數組來存儲一個值。可能是一個怪癖,但仍然可疑。

UPDATE

的問題是在等功能;幾個大小錯誤的reallocs。

+0

1.'monomAllocationVerification'只驗證指針的地址不是NULL,如果它調用'exit()'函數。 2.'sumMonomsWithSamePower'返回大小,因爲如果總和2^2和5^2,則只需要數組中的一個單元而不是兩個。 – Quaker

+0

@奎克我看到了,所以'sumMonomsWithSamePower'實際上修改了'product'數組,但是沒關係。現在我沒有看到這個代碼的麻煩,但仍然有優化的地方。你偶爾執行realloc,但實際上你知道你需要的內存量。它是'size1 * size2 * sizeof(MONOM)'。在第一個'malloc'中預先分配它,所以你不需要重新分配它。然而,腐敗問題超出了這個規範。並沒有簡單的方法來找到它;但請嘗試將您期望的大小與您分配的大小進行比較。 – Lyth

+0

所以你建議我分配悲觀主義者的大小,並重新分配它,如果有未使用的內存? – Quaker

0

我會檢查malloc()的返回值並使用perror()來描述發生了什麼錯誤。這裏還有malloc()perror()的文檔。

if((product = (MONOM*)malloc(phSize*sizeof(MONOM))) == NULL) 
{ 
     perror("ERROR: Failed to malloc "); 
     return 1; 
     //perror() will display a system specified string to describe the error it may tell you the error 
} 

你也知道MONOM的大小嗎?如果不將以下行添加到您的代碼中。所有的

printf("MONOM SIZE = %i\n", sizeof(MONOM)); 
+0

返回值由'monomAllocationVerification'檢查,MONOM的大小爲8,因爲它是兩個整數的結構(2倍4)。 – Quaker

相關問題