La copie d'Un Tableau Alloué Dynamiquement à l'Autre C++
Cela semble comme il devrait avoir une super solution facile, mais je ne peux pas le comprendre. Je suis tout simplement la création d'un redimensionnement de tableau et d'essayer de copier toutes les valeurs d'origine, et enfin la suppression de l'ancien tableau pour libérer de la mémoire.
void ResizeArray(int *orig, int size) {
int *resized = new int[size * 2];
for (int i = 0; i < size; i ++)
resized[i] = orig[i];
delete [] orig;
orig = resized;
}
Ce qui semble être le cas ici, c'est que resized[i] = orig[i]
est de copier les valeurs par référence plutôt que de la valeur, que l'impression orig après c'est redimensionnée retourne un tas de ferraille valeurs, à moins que j'en commentaire delete [] orig
. Comment puis-je faire une copie de orig à redimensionnée, ou est-il un autre problème que je suis confronté? Je ne veux pas utiliser std::vector.
Même si vous ne souhaitez pas utiliser
std::vector
, vous permettrait de gagner beaucoup en les enveloppant de cette dans une classe afin que les clients peuvent passer autour d'un invariant de l'objet et ne pas avoir à gérer le fait que la mise en œuvre de pointeur est en train de changer avec tous les redimensionner. :-/OriginalL'auteur Rahul Gupta-Iwasaki | 2011-11-08
Vous devez vous connecter pour publier un commentaire.
Rappelez-vous, les paramètres en C++ sont passés par valeur. L'affectation d'
resized
à un copie du pointeur de la souris qui a été transmis, le pointeur en dehors de la fonction reste la même.Vous devez soit utiliser une double indirection (ou un "double pointeur", c'est à dire un pointeur vers un pointeur vers
int
):ou une référence à l'aide du pointeur:
Par ailleurs, pour le tableau des tailles vous devez utiliser le type
std::size_t
de<cstddef>
- il est garanti pour contenir la taille de n'importe quel objet et rend clair que nous avons affaire avec la taille d'un objet.c'est une option aussi, mais je pense que ces formes conviennent mieux le retrait de l'utiliser.
Comme un point de clarification, par "double pointeur" l'intimé signifie "double indirection". Quand je l'ai lu, j'ai été confondu pourquoi il a voulu substituer
double *
pourint *
.OriginalL'auteur Matteo Italia
Je vous suggère fortement de remplacer les tableaux avec
std::vector<int>
. Cette structure de données redimensionner au besoin et le redimensionnement a déjà été testé.OriginalL'auteur Thomas Matthews
orig
doit être un pointeur vers un pointeur vers l'attribuer àresized
:OriginalL'auteur Drew