Si une classe est déclarée comme suit: et cela pourrait être fait comme ceci: p> Comment une classe obtient-elle alloué sur le tas, comme si je fais myClass * mine = nouveau myClass (); code>
La mémoire allouée alloue-t-elle également les 250 octets dans le deuxième exemple avec l'instanciation de la classe? Et le membre sera-t-il valable pour toute la vie de MyClass Object?
Quant au premier exemple, est-il pratique d'allouer des membres de la classe sur le tas? P> p>
3 Réponses :
Lorsque vous appelez Dans votre premier exemple, il y aura de l'espace alloué dans les deux: 4 octets sur la pile pour l'instance de MyClass (supposant des pointeurs 32 bits) et 250 octets sur le tas pour le tampon attribué au mymember. P >
Dans le deuxième exemple, 250 octets seront alloués sur la pile pour l'instance de MyClass. Dans ce cas, MyMember est traité comme un décalage dans l'instance. P> Nouveau code> Il attribue à partir du tas, sinon il alloue de la pile (nous ignorerons
malloc code> et son ILK). P>
Ce n'est pas vraiment correct, dans le deuxième exemple, la classe contient un tableau de 250 caractères. Tout sera sur le tas si vous faites quelque chose comme myClass * foo = nouvelle myClass; code>
Ah - Je n'ai pas vu le Nouveau MyClass CODE> (ou peut-être que l'OP l'a ajouté dans les "modifications" ne reçoit pas noté "). Donc, cette réponse n'est pas du tout correcte car la question se trouve. Mais malheureusement, je ne peux pas la supprimer.
Remarque précoce: Utilisez La mémoire allouée attribue également les 250 octets dans le deuxième exemple avec l'instanciation de la classe? P>
blockQuote>
Il sera entassé alloué dans le constructeur, de la même manière que dans une pile allouée à MyClass. Cela dépend de ce que vous entendez par "avec", cela ne sera pas nécessairement alloué ensemble. P>
et le membre sera-t-il valable pour toute la durée de vie de MyClass Object? P>
blockQuote>
oui. p>
Quant au premier exemple, est-il pratique d'allouer des membres de la classe sur le tas? p>
blockQuote>
Oui, dans certains cas. Parfois, vous souhaitez minimiser la notice du fichier d'en-tête et vous utiliserez parfois une fonction d'usine pour créer le membre. Habituellement, je viens d'aller avec un simple membre non-pointeur. P> std :: String Code> au lieu d'un tas alloué de char []. P>
Merci pour une réponse aussi détaillée que pour la note précoce, j'essaie simplement de collecter des connaissances sur le sujet.
Oui, oui, et oui.
Votre premier exemple a un peu un bogue dans celui-ci, cependant: lequel est-ce que l'un de ses membres de données est un pointeur avec des données allouées en tas, alors il devrait également Déclarez un opérateur de copie-constructeur et d'affectation, par exemple ... P>
MyClass(const MyClass& rhs) { MyMember = new char[250]; memcpy(MyMember, rhs.MyMember, 250); }
Merci pour la pointe, je vais envisager d'utiliser cette technique plus souvent.
Bien que techniquement, Chris soit correct, ce n'est pas une bonne idée de le faire. Utilisez un STD :: Vecteur
La question ne concerne pas du tout des tableaux, j'aurais dû changer cet exemple, c'était sur le concept d'allocation elle-même.
Dupliqué possible de membres de la classe et pile explicite / allocation de tas