调试和编译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