2017-08-11 1 views
1

Je suis débutant en C++. L'intervieweur a dit que c'est une mauvaise pratique de créer un objet dans une fonction. Est-ce vrai?Pourquoi est-ce une mauvaise pratique de créer un objet dans une fonction en C++?

#include <iostream.h> 

class linkedlist { 
    int value; 
    linkedlist *next; 
    static linkedlist *p=NULL; 

    void insert(int data) { 
     linkedlist node; 
     node.value=data; 
     node.next=NULL; 

     if(p==NULL) 
      p=node; 
     else { 
      p->next=node; 
      p=p->next; 
     } 
    } 
} 

int main() { 
    linkedlist h; 
    h.insert(10); 
    h.insert(20); 
    return 0; 
} 
+2

L'ensemble du code est tout sauf bonne pratique. À partir de '#include '. – LogicStuff

+2

@LogicStuff Je ne comprends pas votre commentaire .. – user7937993

+1

@LogicStuff Qu'y a-t-il à downvote? Tu aurais pu attendre. J'ai clairement dit que je suis un débutant – user7937993

Répondre

5

Le problème est "durée de vie"; le noeud que vous avez créé ne vit que dans le cadre de pile de la fonction et lorsque la fonction se termine, sa mémoire est récupérée. Le pointeur statique p le liera quand même et cela conduira à un "comportement indéfini" quand quelqu'un accédera plus tard à la liste chaînée.

L'utilisation d'objets locaux n'est pas mauvaise en général, c'est seulement mauvais si vous attendez qu'ils survivent à la fin de la fonction, parce qu'ils ne le font pas.

Vous devez allouer des objets longue durée l'objet sur le magasin gratuit, en utilisant new.

+0

Merci. Alors mon insertion change à la structure ci-dessous droite? void insert() { linkedlist * noeud = nouvelle liste liée; nœud-> valeur = données; nœud-> suivant = NULL; si (p == NULL) p = noeud; else { p-> next = noeud; p = p-> suivant; } } – user7937993

+0

@ user7937993 Oui, cela vous permet de démarrer, mais notez que vous ne pouvez faire qu'une liste de 2 nœuds de profondeur avec ce code. Vous aurez besoin d'une boucle pour trouver la fin de la liste avant d'ajouter si vous voulez créer une liste de longueur arbitraire. – user4581301

+0

@ user7937993: ce code fonctionnerait pour un nœud, mais pas pour plus d'un nœud (indice: vous écrasez 'p-> next' avec la nouvelle adresse de nœud ... qui vous dit que' p-> next' était NUL?). La façon simple de gérer l'insertion de nœuds de listes simplement liées consiste à placer de nouveaux nœuds au début de la liste et le code ne requiert aucun «if». – 6502