Le redimensionnement d'un tableau dynamique en c++
J'ai un code qui est en train de produire des résultats inattendus. Voici le code:
#include <iostream>
using namespace std;
int **nums;
int size;
void A(int** arr)
{
int **resize;
resize = new int*[size*2];
for(int i = 0; i < size; i++)
resize[i] = new int(*arr[i]);
cout << endl;
arr = resize;
size *= 2;
delete[] resize;
}
int main()
{
size = 10;
nums = new int*[size];
for(int i = 0; i < size; i++)
nums[i] = new int(i);
for(int i = 0; i < size; i++)
cout << *nums[i] << endl;
A(nums);
cout << endl;
for(int i = (size / 2); i < size; i++)
nums[i] = new int(i);
for(int i = 0; i < size; i++)
cout << *nums[i] << endl;
}
La fonction A(int** arr) fonctionne très bien que ce que je peux en dire et en fait redimensionne le tableau. Cependant, dans la dernière boucle dans le main(), lorsque le tableau est en cours d'impression, les deux premiers éléments du tableau ne sont pas des 0 et des 1 comme il est censé être. Voici le résultat que j'obtiens:
0
1
2
3
4
5
6
7
8
9
16331248
16331712
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
De ces deux premières ints après l'espace sont différentes à chaque fois que le programme est exécuté. Après un peu de débogage, j'ai trouvé que les deux premiers éléments d'impression correctement jusqu'à ce que l'itérateur i=13 dans la seconde à la dernière boucle dans le main(). Ensuite, les deux premiers éléments de la matrice de prendre sur certains des grands nombres. Je ne suis pas sûr de savoir pourquoi cela se passe et j'ai travaillé sur cette question depuis quelques heures maintenant 🙁 Toute aide est appréciée.
Vous devez vous connecter pour publier un commentaire.
A()
n'est pas la modification denums
pointez sur le nouveau tableau. Même si c'était le cas, c'est la suppression de la nouvelle tableau,nums
serait pointent vers une mémoire non valide. Vous devez déclarer learr
paramètre comme une référence, et de supprimer l'ancien tableau à la place de la nouvelle matrice:Pour ce que vous tentez, je pense que vous avez trop d'indirection. Essayez de supprimer un niveau:
Puisque vous êtes à l'aide de C++, vous devriez être en utilisant un
std::vector
au lieu d'un raw de tableau, vous pouvez éliminer lesA()
tout à fait:Tout d'abord, votre fonction,
A
, ne pas redimensionner n'importe quoi. Il imprime un caractère de saut de ligne sur la sortie standard, il multiplie les mondiauxsize
variable par 2, puis il les fuites de mémoire. C'est tout.Maintenant, parce qu'il multiplie
size
par 2 (de 10, 20), vous rencontrez un problème, ici:Ici, vous essayez d'accéder à des éléments de 10 à 19 de la matrice qui
nums
points. Mais le tableau quinums
points pour les 10 éléments (numérotés de 0 à 9), de sorte que votre code a un comportement indéfini.