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

我在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;

}

回答:

一方面,这样的:

//save entire array in prev 

prevrow = new int [i+1];

prevrow = currow;

副本的指针,而不是整个数组。

回答:

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

回答:

在你的循环,你这行

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

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

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

此外,你的程序像疯了似的泄漏内存。例如,您不需要在循环内指定new的任何结果至prevrow,因为在此之后您将prevrow更改为指向另一个已分配内存块。此外,您应该拨打delete来查找您不再使用的任何内存。

以上是 调试和编译C++程序后的不同输出 的全部内容, 来源链接: utcz.com/qa/260687.html

回到顶部