8
votes

Copier d'une matrice allouée dynamiquement à une autre C ++

Cela semble être comme il devrait avoir une solution super facile, mais je ne peux tout simplement pas comprendre. Je crée simplement un tableau redimensionné et essaye de copier toutes les valeurs d'origine, puis supprimez enfin l'ancien tableau pour libérer 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;
}


2 commentaires

Notez qu'il n'y a pas de "valeurs de copie par référence". Soit vous créez une nouvelle référence aux mêmes données ou à copier.


Même si vous ne voulez pas utiliser std :: vecteur , vous gagneriez beaucoup en enveloppant cela dans une classe afin que les clients puissent passer autour d'un objet invariant et ne pas avoir à gérer le fait que la Le pointeur de mise en œuvre change avec chaque redimensionnement. : - /


3 Réponses :


13
votes

N'oubliez pas que les paramètres en C ++ sont passés par la valeur. Vous attribuez redimensionné à un copier du pointeur qui vous a été transmis, le pointeur en dehors de la fonction reste identique.

Vous devez utiliser une double indirection ( ou un "double pointeur", c'est-à-dire un pointeur à un pointeur sur int ): xxx

ou une référence au pointeur: xxx

d'ailleurs, pour les tailles de tableau, vous devez utiliser le type std :: Taille_t à partir de - il est garanti de Tenez la taille de n'importe quel objet et indique clairement que nous traitons de la taille d'un objet.


3 commentaires

+1 L'autre option consiste à renvoyer la nouvelle matrice en utilisant ... la valeur de retour.


@ Andrécaron: C'est une option aussi, mais je pense que ces formes conviennent mieux à l'utilisation en retrait.


En tant que point de clarification, par «double pointeur», le répondant signifie «double indirection». Quand je l'ai lu d'abord, j'ai été confus pourquoi il voulait remplacer double * pour int * .



2
votes

Orig doit être un pointeur sur un pointeur pour l'affecter à redimensionné : xxx


0 commentaires

3
votes

Je suggère fortement de remplacer les tableaux avec std :: vecteur . Cette structure de données redimensionnera selon les besoins et le redimensionnement a déjà été testé.


2 commentaires

Alors que vecteurs en général sont quelque chose d'intéressant, il existe également une variété de raisons contre eux. Ainsi, votre réponse est basée sur l'opinion et plutôt un commentaire qu'une réponse réelle au problème de l'OP.


@Markus: On pourrait dire la même chose à propos des tableaux. Il existe également une variété de raisons contre eux, donc la question de l'OP est une opinion fondée sur l'opinion et devrait être fermée (et peut-être supprimée).