调试和编译C++程序后的不同输出
-
22-09-2019 - |
题
我在 XP 虚拟机中的 MingW 编译器上运行 CodeBlocks。我写了一些简单的代码,可以访问 CL1P ,它回答了算法问题 代码厨师 (好吧,它只回答了部分问题,因为我还没有包含多个测试用例的循环。
然而,我的问题是,在调试模式下运行它时,它为输入提供正确的输出 5:
3
1
2 1
1 2 3
然而,当我构建并运行它时,它给出了荒谬的巨大输出 131078,这对我来说似乎是垃圾。我不明白这是怎么发生的,但我猜测这与动态内存分配有关。这里有什么问题,我该如何解决它?我什至通过在线编译器运行它 博斯库尔, ,效果很好。添加测试用例循环后,代码甚至可以在 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;
复制指针,而不是整个数组。
其他提示
在 Linux 机器上通过 Valgrind 运行代码,您会惊讶地发现您的代码有多少地方泄漏了内存。如果您在管理内存方面遇到了困难,请做好并在分配更多内存之前“删除”所有新分配的内存。另一方面,如果您更喜欢简单的方法,请使用 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
对于您不再使用的任何内存。