Différentes sorties après le débogage et la compilation de programmes C ++
-
22-09-2019 - |
Question
Je suis en cours d'exécution CodeBlocks sur le compilateur MinGW dans une machine virtuelle XP. Je l'ai écrit dans un code simple, accessible à cl1p , qui répond à la question de l'algorithme CodeChef (Eh bien, il répond que cela en partie, comme je l'ai pas encore compris la boucle de cas de tests multiples.
Cependant, mon problème est que lors de l'exécution en mode debug, il donne la sortie correcte de 5, pour l'entrée:
3
1
2 1
1 2 3
Cependant, quand je construis et l'exécuter, il donne la sortie absurde, énorme 131078, ce qui semble être du charabia pour moi. Je ne comprends pas comment diable ce qui se passe, mais je devine qu'il est quelque chose à voir avec l'allocation dynamique de mémoire. Quel est le problème ici, et comment puis-je résoudre ce problème? Je l'ai même couru par le compilateur en ligne BotSkool , et il a bien fonctionné . Après avoir ajouté la boucle pour les cas de test, le code a même travaillé correctement sur 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;
}
La solution
Pour une chose, ceci:
//save entire array in prev
prevrow = new int [i+1];
prevrow = currow;
copies le pointeur, pas tout le tableau.
Autres conseils
Exécuter le code par Valgrind sur une machine Linux et vous serez étonné de voir combien d'endroits votre code est une fuite de mémoire. Si vous prenez la route difficile de gérer votre mémoire, faites-le bien et « supprimer » toute la mémoire nouvelle allouée avant d'allouer plus. Si, d'autre part, vous préférez la route facile, utiliser un std :: vecteur et oublier la gestion de la mémoire.
Dans votre boucle, vous avez cette ligne
int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];
Sur la première itération de la boucle principale, lorsque currownum == 1
, la boucle contenant cette ligne sera entrée, comme i
est initialisé à 1
. Mais à la première itération, prevrow
n'a qu'un seul élément et cette ligne tente d'accéder prevrow[1]
. conduisant au résultat que vous voyez dans une version de débogage, la mémoire est simplement initialisé à zéro, mais dans une version normale, vous obtenez une valeur de déchets qui vient de se passer dans la mémoire,.
Quasiment toujours, quand vous obtenez des valeurs de déchets dans une version normale, mais tout va bien dans une version de débogage, vous accédez à une mémoire non initialisée.
En outre, votre programme est une fuite de mémoire comme un fou. Par exemple, vous ne devez attribuer aucun résultat de new
dans la boucle à prevrow
car juste après que vous changez prevrow
pour pointer vers un autre bloc de mémoire allouée. En outre, vous devez appeler delete
pour une mémoire que vous n'utilisez plus.