2010-01-01 51 views
1

我在XP虛擬機中的MingW編譯器上運行CodeBlocks。我在一些簡單的代碼寫的,可訪問的cl1p,回答在CodeChef算法的問題(當然這只是回答這部分,因爲我還沒有包括多個測試用例的循環。調試和編譯C++程序後的不同輸出

不過,我的問題是,而在調試模式下運行,它給出了5正確的輸出,對於輸入:

然而,當我構建並運行它,它給出了荒謬的,巨大的產出131078,看到了什麼ms像垃圾給我。我不明白這到底是怎麼回事,但我猜測這與動態內存分配有關。這裏有什麼問題,我該如何解決它?我甚至通過BotSkool在線編譯器運行它,並且它工作正常。在爲測試用例添加循環之後,代碼甚至可以在CodeChef上正常工作!

#include <iostream> 

using namespace std; 

int main() 
{ 
    // Take In number of rows 
    int numofrows; 
    cin >> numofrows; 

    // Input Only item in first row 
    int * prevrow; 
    prevrow = new int[1]; 
    cin >> prevrow[0]; 

    // For every other row 
    for (int currownum = 1; currownum < numofrows; currownum++) 
    { 
     // Declare an array for that row's max values 
     int * currow; 
     currow = new int[currownum+1]; 

     int curnum; 
     cin >> curnum; 

     // If its the first element, max is prevmax + current input 
     currow[0] = prevrow[0] + curnum; 

     // for every element 
     int i = 1; 
     for (; i <= currownum; i++) 
     { 
      cin >> curnum; 

      // if its not the first element, check whether prevmax or prev-1max is greater. Add to current input 
      int max = (prevrow[i] > prevrow[i-1]) ? prevrow[i] : prevrow[i-1]; 

      // save as currmax. 
      currow[i] = max + curnum; 
     } 

     // save entire array in prev 
     prevrow = new int[i+1]; 
     prevrow = currow; 
    } 

    // get highest element of array 
    int ans = 0; 
    for (int j=0; j<numofrows; j++) 
    { 
     if (prevrow[j] > ans) 
     { 
      ans = prevrow[j]; 
     } 
    } 

    cout << ans; 
} 
+0

你應該發佈實際的代碼,而不是鏈接。 – 2010-01-01 22:11:26

回答

1

一方面,這樣的:

//save entire array in prev 
    prevrow = new int [i+1]; 
    prevrow = currow; 

副本的指針,而不是整個數組。

+0

你確定嗎?我想要一種方法來將所有currow的值複製到prevrow中。我怎麼做? – Neil 2010-01-02 07:01:03

+0

一種方法是memcpy:memcpy(prevrow,currow,sizeof(int)* i); – 2010-01-02 13:04:02

1

通過Valgrind在Linux機器上運行代碼,您會驚訝於代碼泄漏內存的位置。 如果你正在努力管理你的記憶,那麼做好它並在分配更多內容之前'刪除'所有新分配的內存。 另一方面,如果您更喜歡輕鬆的道路,請使用std :: vector並忘記內存管理。

+0

哇。我完全不知道向量,並且感覺很愚蠢,因爲它在搜索與Java中ArrayList相當的C++時顯示出來。無論如何,謝謝,這些知識將對我有很大的幫助。您推薦學習C++中所有其他數據結構的站點? 此外,Valgrind網站不提供二進制文件。任何你知道的地方,我可以得到Mac OS X的二進制文件?我現在在我的Mac上安裝了不兼容的XCode舊版本,並且現在不想嘗試構建應用程序(Unix命令行不太好) – Neil 2010-01-02 07:00:13

+0

包括http://www.cplusplus.com/reference/和http://www.cppreference.com/wiki/start in your bookmarks for a starter :)您可以在這裏找到C++標準庫中提供的數據結構和算法。關於它們的教程比比皆是。谷歌! – 2010-01-02 07:51:43

+0

Valgrind目前還沒有以Mac OS X的二進制形式提供,但您在Mac OS X中有替代品.XCode提供了幾種免費工具,如Instruments和MallocDebug。 – 2010-01-02 08:08:13

1

在你的循環,你這行

int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1]; 

在主循環的第一次迭代中,當currownum == 1,將進入包含此行的循環,爲i被初始化爲1。但在第一次迭代中,prevrow只有一個元素,此行嘗試訪問prevrow[1]。在調試版本中,內存只是初始化爲零,但在一個正常的版本中,你會得到一些剛好在內存中的垃圾值,從而導致你看到的結果。

幾乎總是如此,當您在普通版本中獲得垃圾值時,但在調試版本中一切正常時,您正在訪問一些未初始化的內存。

此外,你的程序像瘋了似的泄漏內存。例如,您不需要在循環內指定new的任何結果至prevrow,因爲在此之後您將prevrow更改爲指向另一個已分配內存塊。此外,您應該撥打delete來查找您不再使用的任何內存。