Pointeur et de vecteurs en C++
Je commence avec C++ et j'ai un doute:
Je suis en train de faire une fonction qui renvoie un vecteur d'objets d'une classe MyClass
.
vector<MyClass>* myMethod()
La première question est, il est approprié de renvoyer un pointeur?
La deuxième question est: si je vais retourner un pointeur, dois-je également insérer un pointeur de MyClass objet dans le vecteur?
MyClass* object;
myVector.push_back(*object);
I'm making a function which will return a vector of objects of a class MyClass
Non, vous n'êtes pas. Vous êtes de retour d'un pointeur.it's correct to return a pointer?
Cela dépend de beaucoup de, beaucoup de choses.L'exemple de code (a) utilise un pointeur non valide et non valide déréférencement de dit de pointeur non valide; (b) n'a pas de sens parce que vous n'êtes pas à l'insertion d'un pointeur dans le vecteur à tous
OriginalL'auteur Maverik | 2012-02-09
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal avec la méthode qui retourne le pointeur de vecteur comme ceci:
vector<MyClass>* myMethod()
. Mais vous devriez vous poser quelques questions, comme:vector<MyClass>
?delete
/free
cette mémoire ?Et à votre deuxième question: je voudrais faire du vecteur de pointeurs sur des objets de
MyClass
(vector<MyClass*>
) que si elle est vraiment nécessaire. Il va vous causer quelques problèmes avec la gestion de la mémoire, nous allons donc choisir une voie plus facile.Ok, parlons de cette question: Devrait également cette méthode allouer de la mémoire pour ce vecteur?
Si le but de cette méthode est à créer un vecteur, puis oui, la méthode doit également allouer de la mémoire pour elle:
appelant doit nettoyer ensuite:
Si le but est simplement de récupérer le pointeur de certains vecteur spécifique qui ne peut être obtenu par l'appelant, il pourrait ressembler à ceci:
de l'appelant ne devrait pas supprimer ce vecteur dans ce cas:
J'ai édité ma réponse.
Dernière question 😉 C'est si je ne retourne pas un pointeur aussi si j'alloue de la mémoire? (
vector<MyClass>* v = new vector<MyClass>
)Si vous retournez vecteur (
vector<int> myMethod()
) et identification des appelsvector<int> v; v = myMethod();
, puis copie de vecteur que vous êtes retourné à partir de votre méthode est créé et stocké dansv
.OriginalL'auteur LihO
Un vecteur peut être un vecteur d'objets ou d'un vecteur de pointeurs. C'est complètement indépendant de si vous avez un vecteur ou un pointeur vers le vecteur.
Si vous êtes débutant en C++ essayez d'éviter les pointeurs tout à fait. Il suffit de retourner un vecteur d'objets. Rappelez-vous que le vecteur contient son contenu. Lorsque vous mettez un objet en un vecteur il sera copié.
+1 "Ne pas utiliser de pointeurs nus" ne peut pas être assez souligné.
OriginalL'auteur CB Bailey
En C++11, il vous suffit de retourner
std::vector<T>
, et il sera rapide. Aucune temporaire va inutiles, commestd::vector
prend en charge déplacement sémantique, ce qui signifie que les ressources allouées pour temporaire sera volé par le déplacement sémantique fonctions.Et si votre type
T
gère les ressources, alors vous devriez mettre en œuvre move-semantic ainsi, avec l'habitude de copier-sémantique.std::vector<T>
serait souvent bien. RVO existe longtemps avant 2011.RVO n'est pas garanti dans tous les cas.
automatique se déplace à partir de variables locales ne se produira que si les critères de copie élision sont satisfaites en premier lieu.
Je n'ai pas compris votre commentaire et pourquoi vous dites que c'est en premier lieu?
Bien sûr, vous le pouvez.
OriginalL'auteur Nawaz
Oui, vous pouvez retourner un pointeur sur un vecteur et le sens de ce que vous voulez être en mesure de modifier ce vecteur. Il suffit de garder à l'esprit que vous ne devez pas renvoyer un pointeur vers une variable locale.
Comme pour pousser les pointeurs dans le vecteur - cela dépend de ce que vous voulez faire, mais vous n'AVEZ pas À pousser poiners.
OriginalL'auteur Ivaylo Strandjev