C++ vecteur push_back
Quelle est la bonne façon de pousser un nouvel objet élément sur un std::vector
? Je veux que les données allouées dans le vecteur. Sera-ce de copier l'objet newradio
dans le vecteur et ensuite se débarrasser de newradio
quand elle est hors de portée (par exemple de la pile)?
vector<Radio> m_radios;
Radio newradio(radioNum);
m_radios.push_back(newradio);
Et puis, quand je libre de l'objet contenant m_radios
, ce sera gratuit toute la mémoire allouée par le vecteur?
Vous devez vous connecter pour publier un commentaire.
std::vector
gère sa propre mémoire. Cela signifie que, lorsque le destructeur d'un vecteur est appelé la mémoire occupée par le vecteur est libéré.std::vector
invoque également un objet destructeur quand il est enlevé (parerase
,pop_back
,clear
ou le vecteur du destructeur).Quand vous faites cela:
Vous ajoutez une copie de
newradio
(créé à l'aide deRadio
s'constructeur de copie) pour le vecteur.newradio
sera détruite quand elle est hors de portée, et la copie sera détruit quand il est supprimé à partir du vecteur (comme pour n'importe quel objet).C'est un point important:
std::vector
seulement les magasins de copies d'un objet, ce qui signifie que l'objet doit avoir un sens constructeur de copie (et un opérateur d'affectation, mais c'est un autre problème). Si vous avez un vecteur de pointeurs, alors que le pointeur lui-même va être copié, et non pas ce qu'il désigne. Notez que ce comportement est le même pour chaque conteneur standard (commestd::list
oustd::set
).En règle générale, si vous n'êtes pas à l'aide de pointeurs, alors vous n'avez pas à vous soucier de libération de la mémoire vous-même.
En C++11, la plupart des conteneurs (y compris les
vector
) ont unemplace_back
méthode qui construit un objet en place à la fin du conteneur. Il faut un tas de paramètres et appelle le constructeur qui correspond le mieux à ces paramètres (ou échoue si aucun constructeur existent), l'utilisation de ce constructeur pour créer l'objet, sans aucune copie, à la fin du conteneur. Ainsi, le code ci-dessus peut être réécrite comme:Aussi en C++11, les conteneurs sont généralement déplacer au courant, donc ils n'ont plus besoin d'objets pour être copiables: si elles sont mobiliers, puis le conteneur va déplacer son contenu (p. ex. lors de réaffectations, par exemple). Copiables types sont encore nécessaires si vous souhaitez copier le vecteur.
emplace_back
push_back()
permettra de stocker une copie de son argument dans le vecteur. Aussi longtemps queRadio
met en œuvre correcte de la valeur de la sémantique, il n'y aura pas de problèmes avec elle.Oui poussant newRadio va pousser une copie de la Radio de l'objet dans le vecteur. Vous n'avez pas besoin de libérer le vecteur car il est en local uniquement de sorte qu'il sera détruit une fois que vous êtes hors de sa portée. Si par exemple vous avez écrit
Ensuite, vous avez pour libérer de la mémoire en appelant le vecteur destructeur manuellement.
Essayez ceci:
de sortie:
Yup,
radioNum
sera copié enm_radios
. Tant que vous n'êtes pas la désallocation de pointeurs quandnewradio.~Radio();
se produit (hors de portée), c'est OK. Sim_radios
, ou une sous-classe utilise des pointeurs, vous aurez besoin de passer à l' pointeurs intelligents (shared_ptr
).Quand
m_radios
est hors de portée, le destructeur est appelé automatiquement, et tous les trucsstd::vector
détient est libéré.En plus d'autres réponses que de vérifier que l'objet est copié dans le récipient lors de l'utilisation de
push_back
via des appels au constructeur de copie, vous pouvez également garder à l'esprit les nouvellesemplace_back
fonctionnalité ajoutée avecc++0x
.Appel
emplace_back
permet de contourner la création de tous les objets temporaires et ont l'objet construit dans l'intérieur du récipient directement.emplace_back
est un varardic modèle de fonction qui accepte les paramètres que vous devez passer au constructeur de votre objet, donc dans ce cas:ne créera aucun intermédiaire temporaires. Cela peut être utile si vos objets sont chers à copier.
Espère que cette aide.
Par défaut, std::vector gère la mémoire elle-même en utilisant le constructeur de copie de la classe sous-jacente. Ainsi, il agit un peu comme si l'élément du vecteur est une variable locale (lorsque le vecteur est hors de portée, l'élément est détruite).
Lorsque vous ne souhaitez pas ce comportement, vous pouvez utiliser un vector de pointeur ou boost::ptr_vector à la place.