11
votes

Remplacement de Realloc (C -> C ++)

Dans une question antérieure, j'ai posé des questions sur les pointeurs de table de caractères, mais j'ai été dirigé vers la meilleure solution d'utilisation du système d'allocation C ++ au lieu de Mallocs. (Je convertissage du code C en C ++)

Cependant, j'ai toujours un problème avec une fonction similaire: p>

J'ai changé: p> xxx pré>

et p> xxx pré>

Cependant, que dois-je faire avec realloc dans la fonction suivante: p> xxx pré>

Je reçois l'erreur suivante : P>

error: invalid conversion from 'void*' to 'char**'|


1 commentaires

Ignorer le fait que vous utilisez réelloc () incorrectement dans la pièce de code ci-dessus. Ceci est une faiblesse de C ++ causée car les objets ont des constructeurs / destructeurs. Le problème est résolu en utilisant des tableaux de vecteur plutôt que des matrices brutes.


8 Réponses :


2
votes

http://www.cplusplus.com/forum/general/18311/

(en bref - il n'y a pas vraiment d'équivalent C ++ à realloc , mais peut-être que vous feriez mieux d'utiliser un vecteur ?)


5 commentaires

Pourriez-vous m'expliquer ce que fait exactement ré-réalloc ici? De plus, en remplaçant la solution actuelle avec des vecteurs, cela signifie que, au lieu d'une pile, j'utilise un périphérique similaire à une matrice (c'est-à-dire vecteur). I.e.: Cela signifie-t-il que je devrais remplacer la solution de pile actuelle?


@ BIOSCI3C Vous pouvez également utiliser une pile alors. C ++ Définit les deux types de la bibliothèque de modèles standard. Voir Cplusplus.com/reference/stl


@ BIOSCI3C - Realloc crée un espace de mémoire plus gros pour contenir le contenu de ce qui est dans TMP , car le vieil espace était rempli. Les conteneurs C ++ ré-dimensionnables le font automatiquement pour vous. Vous pouvez utiliser un pile ou un vecteur ; Les deux supporteront les deux opérations "de la pile" (mais le vecteur prend également en charge l'accès aléatoire, tandis que la pile ne signifie pas).


De plus, dans votre solution actuelle, TMP n'est pas une pile, c'est un tableau.


Realloc essaiera de redimensionner le bloc de mémoire actuellement alloué. Si cela ne peut pas (dire, vous essayez de l'agrandir et qu'il y a un autre bloc de la voie), il allouera un nouveau bloc de mémoire, copier le contenu du pointeur et renvoyera un nouveau pointeur à la structure. (Le pointeur d'origine n'a pas changé, sauf si vous le faites). Compte tenu de la nature des objets en C ++ (copie profonde VS Copie peu profonde, pour une), ce type de logique doit être géré par l'utilisateur depuis que le compilateur ne peut pas savoir comment les choses doivent être copiées.



-1
votes

Il n'y a pas d'équivalent C ++ de realloc ().

meilleur usage: xxx

L'erreur que vous obtenez est parce que c ++ est moins indulgent avec la coulée de type implicite.


2 commentaires

Pas la meilleure utilisation - l'idée de realloc est de conserver le contenu de la mémoire.


Si vous insistez pour faire une allocation de mémoire manuelle, vous devriez allouer la nouvelle mémoire, puis copier le contenu de la mémoire nouvellement attribuée. Ce n'est qu'après que ces deux personnes réussissent si vous supprimez l'ancienne mémoire.



1
votes

Malheureusement, il n'y a pas de realloc en C ++ (en raison du fait que la mémoire pourrait contenir des objets non trivialement construits ou juste non-copieux). Allouer de nouveau tampon et copier ou apprendre à utiliser std :: vecteur ou std :: pile qui ferait cela pour vous automatiquement.


0 commentaires

14
votes

Ceci semble être un tableau non qualifié qui pousse au besoin.

Arrêtez d'utiliser une allocation de mémoire explicite, vous n'avez presque certainement aucun besoin. Utilisez std :: vecteur ou une autre des conteneurs dynamiques de la bibliothèque standard C ++ qui se développent automatiquement au besoin pour vous.

On dirait également que vous utilisez des chaînes de style C NULL terminées. Pourquoi pas utilisé std :: string à la place?


1 commentaires

Je convertissons un ancien code C et apprennent comme je vais (non familier avec C Beaucoup, juste C ++). Donc cela pourrait fonctionner.



15
votes

C Permet Void * implicitement converti en n'importe quel pointeur. C ++ ne le fait pas, donc si vous utilisez realloc , vous devez lancer le résultat sur le type approprié.

Mais plus important encore, en utilisant realloc sur un pointeur renvoyé par nouveau [] est un comportement indéfini. Et il n'y a pas d'équivalent de style C ++ direct à realloc .

Vos choix sont, du moins à la plupart idiomatique:

  • Stick to MALLOC / REALLOC / GRATUIT et lancer les pointeurs.
  • Utilisez Nouveau [] + Suppr [] au lieu de realloc
  • Utilisez std :: vecteur au lieu de gérer votre propre mémoire.

2 commentaires

De plus, vous ne devriez pas mélanger de nouveaux / Supprimer et Malloc / CalloC / Realloc / Allocation de mémoire libre.


Techniquement, vous devez utiliser Suppr [] avec Nouveau [] .



2
votes

Realloc ne se soucie pas vraiment de téléphoner à des constructeurs, d'utiliser Realloc après New semble être une mauvaise idée. Vous devriez aller pour vecteur comme une meilleure approche. Vous pouvez redimensionner des vecteurs.


0 commentaires

5
votes

en C ++, vous ne devez pas utiliser de tableaux (même alloués dynamiquement).

Ceci a été remplacé par STD :: vecteur

in c: xxx

in c ++ xxx


0 commentaires

1
votes

Je envisagerais de passer de la matrice dynamique fabriquée à la main à un vecteur un bon premier choix.

Autant que le vecteur doit contenir directement des objets ou contenir des pointeurs sur les objets réels, il n'y a pas une seule réponse définitive - cela dépend d'un certain nombre de facteurs.

Le plus gros facteur est de savoir si ce sont ce que j'appellerais des objets "entité" - ceux pour lesquels la copie n'a aucun sens. Un cas classique à titre serait quelque chose comme un iOSTREAM ou une connexion réseau. Il n'y a généralement pas de moyen logique de copier ou d'attribuer un objet comme celui-ci. Si c'est le genre d'objet que vous avez affaire, vous êtes à peu près bloqué Stocker les pointeurs.

Si, toutefois, vous traitez de ce qui est généralement défini (des objets de valeur), de copier et d'affectation ira bien et que vous stockez les objets directement dans le vecteur ira bien. Avec des objets comme celui-ci, la principale raison de stocker des pointeurs sera plutôt qu'un vecteur peut / copiera des objets autour du moment où il doit élargir la mémoire pour faire de la place pour plus d'objets. Si vos objets sont si grands et coûteux de copier que cela est inacceptable, vous voudrez peut-être stocker quelque chose de pointeur dans le vecteur pour obtenir une copie et une mission bon marché. Les chances sont que pas être un pointeur cru si - ce sera probablement une sorte d'objet pointeur intelligent qui fournit plus de sémantique de valeur de valeur, de sorte que la plupart des autres code peuvent traiter l'objet comme une valeur simple. et les détails de ses opérations coûteuses et de tels peuvent rester cachés.


0 commentaires