9
votes

Affectation des membres de la classe sur le tas / pile?

Si une classe est déclarée comme suit: xxx

et cela pourrait être fait comme ceci: xxx

Comment une classe obtient-elle alloué sur le tas, comme si je fais myClass * mine = nouveau myClass (); 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?


3 Réponses :


1
votes

Lorsque vous appelez Nouveau Il attribue à partir du tas, sinon il alloue de la pile (nous ignorerons malloc et son ILK).

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.

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.


2 commentaires

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;


Ah - Je n'ai pas vu le Nouveau MyClass (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.



3
votes

Remarque précoce: Utilisez std :: String au lieu d'un tas alloué de char [].

La mémoire allouée attribue également les 250 octets dans le deuxième exemple avec l'instanciation de la classe?

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.

et le membre sera-t-il valable pour toute la durée de vie de MyClass Object?

oui.

Quant au premier exemple, est-il pratique d'allouer des membres de la classe sur le tas?

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.


1 commentaires

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.



7
votes

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);
}


3 commentaires

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 place et toute votre gestion de la mémoire est pris en charge. Pour voir tous les détails: Stackoverflow.com/Questtions/255612/...


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.