调试和编译C ++程序后的不同输出

时间:2010-01-01 22:07:42

标签: c++ debugging compilation garbage

我在XP虚拟机中的MingW编译器上运行CodeBlocks。我写了一些简单的代码,可以在cl1p访问,它在CodeChef回答算法问题(好吧,它只是部分回答,因为我还没有包含多个测试用例的循环。

但是,我的问题是,在调试模式下运行时,它为输入提供了正确的输出5:

3
1
2 1
1 2 3

然而,当我构建并运行它时,它给出了荒谬的,巨大的输出131078,对我来说似乎是垃圾。我不明白这是怎么回事,但我猜它与动态内存分配有关。这有什么问题,我该如何解决?我甚至通过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;
}

3 个答案:

答案 0 :(得分:1)

首先,这个:

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

复制指针,而不是整个数组。

答案 1 :(得分:1)

在Linux机器上通过Valgrind运行代码,您会惊讶于代码泄漏内存的位置。 如果您正在努力管理内存,那就做好并在分配更多内容之前“删除”所有新分配的内存。 另一方面,如果您更喜欢简单的道路,请使用std :: vector并忘记内存管理。

答案 2 :(得分:1)

在你的循环中,你有这一行

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

在主循环的第一次迭代中,当currownum == 1时,将输入包含此行的循环,因为i被初始化为1。但是在第一次迭代中,prevrow只有一个元素,并且此行尝试访问prevrow[1]。在调试版本中,内存只是初始化为零,但在正常构建中,你会得到一些恰好在内存中的垃圾值,从而得到你看到的结果。

几乎总是,当你在普通版本中获得垃圾值时,但是在调试版本中一切都很好,你正在访问一些未初始化的内存。

此外,您的程序正在疯狂地泄漏内存。例如,您不需要在循环内将new的任何结果分配给prevrow,因为在此之后您将prevrow更改为指向另一个已分配内存块。此外,您应该拨打delete以获取您不再使用的任何内存。