Toutes les affirmations suivantes sont-elles vraies?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
Comment la mémoire est-elle allouée en interne Type
dans un vector
ou tout autre conteneur STL?
Réponses:
allouera les
vector
, c'est-à-dire les informations d'en-tête, sur la pile, mais les éléments sur le magasin libre ("tas").alloue tout sur la boutique gratuite.
allouera le
vector
sur la pile et un tas de pointeurs sur le magasin gratuit, mais où ces points sont déterminés par la façon dont vous les utilisez (vous pouvez pointer l'élément 0 vers le magasin libre et l'élément 1 vers la pile, par exemple).la source
vector<Type> vect;
puisque les éléments sont sur le tas et que les informations d'en-tête sont sur la pile, lorsque les informations d'en-tête sont supprimées de la mémoire, comme le retour de fonction, qu'arrivera-t-il aux éléments mémoires? Sont-ils récupérés avec les informations d'en-tête ou non? Si ce n'est pas le cas, cela entraînera-t-il une fuite de mémoire?Non,
vect
sera sur la pile, mais le tableau qu'il utilise en interne pour stocker les éléments sera sur le tas. Les éléments résideront dans ce tableau.Non, comme ci-dessus, sauf que la
vector
classe sera également sur le tas.vect
sera sur la pile, ses éléments (pointeurs versType
) seront sur le tas, et vous ne pouvez pas dire où seront lesType
s vers lesquels pointent les pointeurs. Peut être sur la pile, pourrait être sur le tas, pourrait être dans les données globales, pourrait être nulle part (par exemple.NULL
Pointeurs).En fait, l'implémentation pourrait en fait stocker entièrement certains vecteurs (généralement de petite taille) sur la pile. Non pas que je connaisse une telle implémentation, mais c'est possible.
la source
En supposant une implémentation qui a en fait une pile et un tas (le C ++ standard ne fait aucune obligation d'avoir de telles choses), la seule vraie déclaration est la dernière.
C'est vrai, sauf pour la dernière partie (
Type
ne sera pas sur la pile). Imaginer:Également:
Vrai sauf la dernière partie, avec un exemple de compteur similaire:
Pour:
c'est vrai, mais notez ici que les
Type*
pointeurs seront sur le tas, mais lesType
instances vers lesquelles ils pointent n'ont pas besoin d'être:la source
delete
aussi).Seule cette affirmation est vraie:
Type*
les pointeurs sont alloués sur le tas, car la quantité de pointeurs peut changer dynamiquement.vect
dans ce cas, il est alloué sur la pile, car vous l'avez défini comme une variable de pile locale.la source
vector a un interne
allocator
qui est chargé d'allouer / désallouer des mémoires à partirheap
devector element
. Quelle que soit la manière dont vous créez un vecteur, ilelement
est toujours alloué sur leheap
. Quant aux métadonnées du vecteur, cela dépend de la façon dont vous le créez.la source