Je travaille sur la fixation du code plus ancien pour mon travail. Il est actuellement écrit en C ++. Ils ont converti une allocation statique en dynamique mais n'a pas modifié les MemSets / MemCMP / MemCY. Ceci est mon premier stage de programmation si nu avec ma question de type Newbe.
Le code suivant est en C, mais je veux l'avoir en C ++ (j'ai lu que Malloc n'est pas une bonne pratique en C ++). J'ai deux scénarios: premièrement, nous avons créé. Ensuite, vous utilisez et f afin de remplir de zéro. La seconde est un pointeur * pf. Je ne sais pas comment définir PF sur tous les 0 est comme l'exemple précédent en C ++. P>
Pourriez-vous juste faire PF = nouveau foo code> au lieu de MALLOC, puis appelle
MEMSET (PF, 0, TAILLEOF (FOO) CODE>? P>
struct foo { ... } f;
memset( &f, 0, sizeof(f) );
//or
struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );
4 Réponses :
Oui, cela fonctionnerait. Cependant, je ne pense pas que Malloc est nécessairement une mauvaise pratique et je ne changerais pas cela juste pour le changer. Bien sûr, vous devez vous assurer que vous correspondez toujours aux mécanismes d'allocation correctement (New-> Supprimer, Malloc-> Gratuit, etc.). P>
Vous pouvez également ajouter un constructeur à la structure et utiliser cela pour initialiser les champs. P>
Pouvez-vous? Oui probablement. Devrais-tu? Non. P>
Bien que cela fonctionnera probablement, vous perdez l'état que le constructeur a construit pour vous. En ajoutant à cela, que se passe-t-il lorsque vous décidez de mettre en œuvre une sous-classe de cette structure? Ensuite, vous perdez l'avantage du code réutilisable que C ++ OOP offre. P>
Qu'est-ce que vous devriez faire à la place, c'est créer un constructeur qui initialise les membres pour vous. De cette façon, lorsque vous sublassez cette structure plus tard sur la ligne, vous utilisez simplement ce constructeur pour vous aider à construire les sous-classes. Ceci est gratuit, code sûr! Utilisez-le! P>
Edit: La mise en garde à ceci est que si vous avez déjà une base de code énorme, ne le modifiez pas avant de commencer à sousclure les structures. Cela fonctionne comme il est maintenant. P>
Oui, mais seulement si foo est une pod. S'il s'agit de fonctions virtuelles ou de quelque chose d'autre à distance C ++ ISH, n'utilisez pas de memset sur celui-ci puisqu'il s'agit de tout sur les internes de la structure / classe. P>
Ce que vous voulez probablement faire au lieu de MEMSET, vous donnez à FOO un constructeur pour initialiser explicitement ses membres. P>
Si vous souhaitez utiliser de nouvelles, n'oubliez pas la suppression correspondante. Mieux vaut mieux utiliser Shared_Ptr :) P>
Merci Ben. Après avoir examiné d'autres fichiers, j'ai remarqué qu'ils utilisent la nouvelle façon de l'initialisation de l'initialisation plus que de créer un constructeur pour la structure. Je vais y aller avec cela puisqu'ils n'ont pas de fonctions virtuelles. Merci pour l'aide.
@garry: Lorsque vous utilisez Nouveau code>, le constructeur est toujours appelé. Vous pouvez initialiser ses attributs là-bas.
Pondanterie mineure qui, à la fois C et C ++, même avec des types de POD, il s'agit d'un comportement techniquement indéfini pour simplement se déplacer en utilisant Memset code> à zéro mémoire, puis lisez cette mémoire comme autre que
Char Code> Types et garantie-no-Padding-bits
(u) intn_t code> types. En pratique, votre implémentation organisera que tous les 0-octets signifient un pointeur nul, un float de 0,0 (comme dans IEEE754), etc., mais toutes les implémentations n'en ont toujours pas fait.
Vous pouvez nouveau foo em> (comme c'est la voie standard en C ++) et implémenter un constructeur qui initialise FOO plutôt que d'utiliser Memset em>. . n'oublie pas non plus si vous utilisez neuf em> pour appeler Supprimer em> lorsque vous avez terminé l'objet, sinon vous finirez par fuites de mémoire. p> p>