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> et p> Cependant, que dois-je faire avec realloc dans la fonction suivante: p> Je reçois l'erreur suivante : P> error: invalid conversion from 'void*' to 'char**'|
8 Réponses :
http://www.cplusplus.com/forum/general/18311/ p>
(en bref - il n'y a pas vraiment d'équivalent C ++ à realloc code>, mais peut-être que vous feriez mieux d'utiliser un
vecteur p>?) P>
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 code>, car le vieil espace était rempli. Les conteneurs C ++ ré-dimensionnables le font automatiquement pour vous. Vous pouvez utiliser un
pile code> ou un
vecteur code>; Les deux supporteront les deux opérations "de la pile" (mais le vecteur
code> prend également en charge l'accès aléatoire, tandis que la pile
code> ne signifie pas).
De plus, dans votre solution actuelle, TMP code> 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.
Il n'y a pas d'équivalent C ++ de realloc ().
meilleur usage: p> L'erreur que vous obtenez est parce que c ++ est moins indulgent avec la coulée de type implicite. p> p>
Pas la meilleure utilisation - l'idée de realloc code> 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.
Malheureusement, il n'y a pas de realloc code> 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 code> ou
std :: pile code> qui ferait cela pour vous automatiquement. P>
Ceci semble être un tableau non qualifié qui pousse au besoin. P>
Arrêtez d'utiliser une allocation de mémoire explicite, vous n'avez presque certainement aucun besoin. Utilisez On dirait également que vous utilisez des chaînes de style C NULL terminées. Pourquoi pas utilisé std :: vecteur code> ou une autre des conteneurs dynamiques de la bibliothèque standard C ++ qui se développent automatiquement au besoin pour vous. P>
std :: string code> à la place? P>
Je convertissons un ancien code C et apprennent comme je vais (non familier avec C Beaucoup, juste C ++). Donc cela pourrait fonctionner.
C Permet Mais plus important encore, en utilisant Vos choix sont, du moins à la plupart idiomatique: p>
Void * code> implicitement converti en n'importe quel pointeur. C ++ ne le fait pas, donc si vous utilisez
realloc code>, vous devez lancer le résultat sur le type approprié. P>
realloc code> sur un pointeur renvoyé par
nouveau [] code> est un comportement indéfini. Et il n'y a pas d'équivalent de style C ++ direct à
realloc code>. P>
MALLOC CODE> /
REALLOC CODE> /
GRATUIT CODE> et lancer les pointeurs. LI>
Nouveau [] code> +
Suppr [] code> au lieu de
realloc code> li>
std :: vecteur
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 [] code> avec
Nouveau [] code>.
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. P>
en C ++, vous ne devez pas utiliser de tableaux (même alloués dynamiquement).
Ceci a été remplacé par STD :: vecteur p>
in c: p> in c ++ p>
Je envisagerais de passer de la matrice dynamique fabriquée à la main à un vecteur un bon premier choix. P>
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. P>
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. P>
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 em> ê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. P>
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.