2012-02-09 9 views
4

Je commence avec C++ et j'ai des doutes:pointeur et vecteurs en C++

je fais une fonction qui renvoie un vecteur d'objets d'une classe MyClass.

vector<MyClass>* myMethod() 

La première question est, il est correct de retourner un pointeur?

La deuxième question est: si je vais retourner un pointeur, devrais-je aussi insérer un pointeur de l'objet MyClass dans le vecteur?

MyClass* object; 
myVector.push_back(*object); 
+0

'je fais une fonction qui renvoie un vecteur d'objets d'une classe MyClass' Non, vous n'êtes pas. Vous renvoyez un pointeur. –

+0

'C'est correct de retourner un pointeur?' Cela dépend de beaucoup, beaucoup de choses. –

+0

Votre exemple de code (a) utilise un pointeur invalide et un déréférencement invalide dudit pointeur invalide; (b) n'a aucun sens parce que vous n'insérez pas du tout un pointeur dans le vecteur –

Répondre

6

Il n'y a rien de mal avec la méthode qui renvoie le pointeur sur le vecteur comme ceci: vector<MyClass>* myMethod(). Mais vous devriez vous poser quelques questions, comme:

  1. Faut-il être un pointeur vers le vecteur? Ne peut-il pas être juste vector<MyClass>?
  2. Cette méthode doit-elle également allouer de la mémoire pour ce vecteur?
  3. Devrait appelant de cette méthode delete/free cette mémoire?

Et à votre deuxième question: je fais vecteur de pointeurs vers des objets de MyClass (vector<MyClass*>) que si elle est vraiment nécessaire. Cela va vous causer quelques problèmes avec la gestion de la mémoire, alors choisissons un moyen plus facile. Ok, parlons de cette question: Cette méthode doit-elle également allouer de la mémoire pour ce vecteur?
Si le but de cette méthode est de créer un vecteur, puis oui, la méthode doit également allouer de la mémoire pour elle:

vector<MyClass>* myMethod() 
{ 
    vector<MyClass>* v = new vector<MyClass>; 
    // initialize, fill or do whatever with this vector 
    return v; 
} 

appelant doit nettoyer alors:

vector<MyClass>* v = myMethod(); 
    // do some stuff 
    delete v; // clean up 

Si le but est simplement de récupérer le pointeur sur un vecteur spécifique qui ne peut pas être obtenu par l'appelant, cela pourrait ressembler à ceci:

vector<MyClass> _x; // caller can not access _x but myMethod can 

vector<MyClass>* myMethod() 
{ 
    return &_x; 
} 

appelant ne doit pas supprimer ce vecteur dans ce cas:

vector<MyClass>* v = myMethod(); 
    // do some stuff, don't delete v 
+0

Question 2: la méthode alloue-t-elle automatiquement la mémoire pour moi si je retourne un pointeur sur un vecteur? Si je ne vais pas retourner un pointeur quand le vecteur sera retiré de la mémoire? Merci! – Maverik

+1

@lucaghera: J'ai édité ma réponse. – LihO

+0

Dernière question;) C'est si je ne retourne pas un pointeur aussi si j'alloue la mémoire? ('vecteur * v = nouveau vecteur ') – Maverik

5

En C++ 11, vous pouvez simplement revenir std::vector<T>, et il sera rapide. Aucun temporaire ne sera inutile, car std::vector prend en charge la sémantique de mouvement, ce qui signifie que les ressources allouées pour le temporaire seront volées par les fonctions sémantique de déplacement.

Et si votre type T gère les ressources, vous devez également implémenter move-sémantique, avec la sémantique de copie habituelle.

+3

Et même sans C++ 11 retourner 'std :: vector ' serait souvent bien. RVO existe bien avant 2011. – kennytm

+0

@KennyTM: RVO n'est pas garanti dans tous les cas. – Nawaz

+3

@Nawaz: les déplacements automatiques à partir de variables locales ne se produisent que si les critères d'élision de la copie sont respectés en premier lieu. –

8

Un vecteur peut être un vecteur d'objets ou un vecteur de pointeurs. Ceci est complètement indépendant de si vous avez un vecteur ou un pointeur sur le vecteur.

Si vous débutez avec C++, essayez d'éviter complètement les pointeurs. Renvoyez juste un vecteur d'objets. Rappelez-vous que le vecteur contient son contenu. Lorsque vous placez un objet dans un vecteur, il sera copié po.

+0

Merci, tondez ma question est: quand vous me suggérez d'utiliser des pointeurs sur le vecteur? – Maverik

+1

+1 "Ne pas utiliser de pointeurs nus" ne peut pas être assez souligné. –

1

Oui, vous pouvez renvoyer un pointeur sur un vecteur, ce qui signifie que vous voulez pouvoir modifier ce vecteur. Gardez juste à l'esprit que vous ne devez pas renvoyer un pointeur vers une variable locale. Comme pour pousser des pointeurs dans le vecteur - cela dépend de ce que vous voulez faire, mais vous n'avez pas besoin d'appuyer sur les pointeurs.