C ++プログラムのデバッグとコンパイル後の異なる出力
-
22-09-2019 - |
質問
私はXP仮想マシンでのMinGWコンパイラのコードブロックを実行していますよ。私は、いくつかの簡単なコードで 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;
}
解決
一つのことについては、これます:
//save entire array in prev
prevrow = new int [i+1];
prevrow = currow;
のコピーポインタではなく、全体のアレイ。
他のヒント
Linuxマシン上のValgrindてコードを実行すると、あなたはあなたのコードがメモリをリークしているどのように多くの場所で驚かれることでしょう。 あなたがあなたの記憶を管理するの険しい道を取っている場合は、より割り当てる前に、すべての新しい割り当てられたメモリを、それをうまくやると「削除」。 一方、あなたは簡単に道を好む場合は、STD ::ベクトルを使用してメモリ管理を忘れます。
あなたのループでは、この行を持っている。
int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];
currownum == 1
がi
に初期化されるよう1
、このラインを含むループは、入力されるメインループの最初の反復で。しかし、最初の反復で、prevrow
は一つだけの要素を持っており、このラインは、アクセスprevrow[1]
にしようとします。デバッグビルドでは、メモリは単純にゼロに初期化されるが、通常のビルドでは、あなただけのあなたが見る結果につながる、メモリ内にあることを起こっていること、いくつかのゴミ値を取得します。
ほとんど常に、あなたが通常のビルドでゴミ値を取得するときに、しかし、すべてはあなたには、いくつかの初期化されていないメモリにアクセスしている、デバッグビルドで結構です。
また、あなたのプログラムは狂ったようにメモリをリークしています。たとえば、あなたは右の後にあなたが割り当てられたメモリの別のブロックにポイントにnew
を変更することをのでprevrow
にループ内prevrow
のいずれかの結果を割り当てる必要はありません。また、あなたは、もはや使用していることを任意のメモリのためのdelete
を呼び出す必要があります。