Czy wszystkie poniższe stwierdzenia są prawdziwe?
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.
Jak jest wewnętrznie przydzielana pamięć Type
w vector
lub innym kontenerze STL?
Odpowiedzi:
alokuje
vector
, tj. informacje nagłówka, na stosie, ale elementy z wolnego magazynu („sterta”).przydziela wszystko w darmowym sklepie.
przydzieli
vector
na stosie i kilka wskaźników w wolnym sklepie, ale gdzie ten punkt jest określony przez sposób ich użycia (możesz wskazać element 0 na wolny magazyn, a element 1 na stos, powiedzmy).źródło
vector<Type> vect;
że elementy są na stercie, a informacje nagłówka są na stosie, kiedy informacje nagłówka są usuwane z pamięci, na przykład funkcja powrotu funkcji, co się stanie z pamięcią elementów? Czy są odzyskiwane z informacjami w nagłówku, czy nie? Jeśli tak nie jest, czy spowoduje to wyciek pamięci?Nie,
vect
będzie na stosie, ale tablica, której używa wewnętrznie do przechowywania elementów, będzie na stercie. Elementy będą znajdować się w tej tablicy.Nie. Tak samo jak powyżej, z tą różnicą, że
vector
klasa również będzie na stercie.vect
będzie na stosie, jego przedmioty (wskaźniki doType
) będą na stercie i nie możesz powiedzieć, gdzie będą te, naType
które wskazują wskaźniki. Może znajdować się na stosie, może znajdować się na stercie, może znajdować się w danych globalnych, może nigdzie nie być (tj.NULL
Wskaźników).Przy okazji, implementacja mogłaby w rzeczywistości całkowicie przechowywać niektóre wektory (zazwyczaj o małym rozmiarze) na stosie. Nie żebym wiedział o takiej implementacji, ale tak.
źródło
Zakładając implementację, która faktycznie ma stos i stertę (standardowy C ++ nie wymaga posiadania takich rzeczy), jedyną prawdziwą instrukcją jest ostatnia.
To prawda, z wyjątkiem ostatniej części (
Type
nie będzie na stosie). Wyobrażać sobie:Również:
Prawda z wyjątkiem ostatniej części, z podobnym przykładem licznika:
Dla:
to prawda, ale zauważ, że
Type*
wskaźniki będą na stercie, aleType
instancje, które wskazują, nie muszą być:źródło
delete
także).Tylko to stwierdzenie jest prawdziwe:
Type*
wskaźniki są przydzielane na stercie, ponieważ liczba wskaźników może zmieniać się dynamicznie.vect
w tym przypadku jest alokowany na stosie, ponieważ zdefiniowałeś go jako lokalną zmienną stosu.źródło
wektor ma wewnętrzny,
allocator
który jest odpowiedzialny za przydzielanie / zwalnianie pamięciheap
dlavector element
. Więc bez względu na to, jak utworzysz wektor,element
jest on zawsze przydzielany doheap
. Jeśli chodzi o metadane wektora, zależy to od sposobu ich utworzenia.źródło