2012-04-03 2 views
1

Puis-je déclarer de nouvelles variables, comme une classe différente, dans un c'tor? Supposons que j'ai une liste de classe nommée et un noeud (imbriqué dans la classe de liste), je veux faire:C'tor en C++ class

List::List(int num) 
{ 
Node Nod(num); //creating a new Node which is holding num 
List_Head=&Nod; //List_Head is a Node pointer variable of List class 
} 

Une fois que je fais cela, je reçois le texte suivant Erreur d'exécution:

Échec de l'assertion de débogage!

Expression: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)

Toute aide?

+0

Ceci est de base C++, vous affectez l'adresse d'une variable locale (c'est-à-dire temporaire).Une fois que vous sortez de la portée c'tor, 'Nod' est supprimé et la mémoire pointée par' List_Head' est supprimée. – azf

Répondre

3

L'étendue et la durée de vie de Nod que vous créez sont limitées au constructeur List::List() Puisqu'il s'agit d'un objet local/automatique.

Une fois que le constructeur retourne Nod n'existe pas et tout en montrant qu'il (List_Head) est un pointeur ballants, deferencing il causerait un comportement non défini et très probablement un accident.

Vous devez créer le Node sur la mémoire dynamique (tas) en appelant new si vous souhaitez le faire au-delà du corps du constructeur.

List_Head = new Node(num); 

Idéalement, vous devriez utiliser une sorte d'un pointeur intelligent au lieu de pointeur brut pour List_Head de sorte que vous n'avez pas à la gestion de la mémoire manuelle. Si vous ne pouvez pas avoir à appeler:

delete List_Head; 

une fois que vous avez terminé votre utilisation afin d'éviter une fuite de mémoire.

+0

Mais si je crée un nœud sur la mémoire dynamique, c'est juste un pointeur. Noeud * nod = new Noeud; Je veux créer non pas un pointeur, mais une variable Node et insérer NUM. Comment je fais ça? – Jjang

+0

@ user1309152: oui, quoi de mal avec ça? Tant que vous avez un pointeur valide pointant vers la mémoire allouée, tout est sûr. –

0

Vous ne pouvez pas faire comme ça. Nod est hors de portée à la fin du constructeur (le dernier }), ce qui signifie que sa mémoire est invalidée, ce qui signifie que List_Head pointe vers une mémoire invalide.

Si vous voulez garder la mémoire autour, vous devez utiliser new, comme

List_Head = new Node(num); 

Assurez-vous de ce que vous deletenew! Mais vous devez être prudent avec ça! La mémoire peut fuir si vous ne la supprimez pas, ou elle peut être supprimée en double si vous ne la manipulez pas correctement. Plus précisément, vous devez vous assurer de mettre en œuvre également le destructeur, le constructeur de copie et l'opérateur d'affectation pour gérer correctement la mémoire que vous allouez. Vous pouvez également utiliser des pointeurs intelligents (tels que std::shared_ptr si vous utilisez C++ 11) pour gérer les suppressions pour vous afin de ne pas perdre de mémoire ou de supprimer la mémoire. Vous devrez peut-être toujours définir votre constructeur de copie et votre opérateur d'affectation, en fonction de la façon dont vous voulez que votre classe agisse (car sans les versions personnalisées, vous obtiendrez un shallow copy de l'objet au lieu d'un deep copy, tu veux).

+0

Merci, et supposons que je n'ai pas List_Head. Comment le ferais-je alors? – Jjang

+0

Vous êtes plutôt bloqué alors. Vous ne pouvez pas ajouter dynamiquement des membres à des classes comme ça. – Cornstalks