Todas as seguintes afirmações são verdadeiras?
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.
Como a memória é alocada internamente para Type
um vector
ou qualquer outro contêiner STL?
Respostas:
alocará a
vector
, ou seja, as informações do cabeçalho, na pilha, mas os elementos no armazenamento gratuito ("heap").aloca tudo na loja gratuita.
alocará o
vector
na pilha e vários ponteiros no armazenamento gratuito, mas onde esses pontos são determinados pela maneira como você os usa (você pode apontar o elemento 0 para o armazenamento gratuito e o elemento 1 para a pilha, digamos).fonte
vector<Type> vect;
como os elementos estão na pilha e as informações do cabeçalho estão na pilha, quando as informações do cabeçalho são removidas da memória, como o retorno da função, o que acontecerá com as memórias dos elementos? Eles são recuperados com as informações do cabeçalho ou não? Caso contrário, isso causará vazamento de memória?Não,
vect
estará na pilha, mas a matriz que ela usa internamente para armazenar os itens estará na pilha. Os itens residirão nessa matriz.Não. O mesmo que acima, exceto que a
vector
classe também estará na pilha.vect
estará na pilha, seus itens (ponteiros paraType
) estarão na pilha e você não pode dizer onde serãoType
os pontos apontados pelos ponteiros. Pode estar na pilha, pode estar na pilha, pode estar nos dados globais, pode estar em lugar nenhum (isto é,NULL
ponteiros).Aliás, a implementação pode de fato armazenar alguns vetores (geralmente de tamanho pequeno) na pilha completamente. Não que eu conheça alguma dessas implementações, mas pode.
fonte
Supondo que uma implementação que realmente tenha uma pilha e uma pilha (C ++ padrão não exija a exigência de tais coisas), a única declaração verdadeira é a última.
Isso é verdade, exceto a última parte (
Type
não estará na pilha). Imagine:Da mesma forma:
True, exceto a última parte, com um exemplo de contador semelhante:
Para:
isso é verdade, mas observe aqui que os
Type*
ponteiros estarão na pilha, mas asType
instâncias para as quais eles apontam não precisam ser:fonte
delete
também).Somente esta afirmação é verdadeira:
Type*
ponteiros são alocados na pilha, porque a quantidade de ponteiros pode mudar dinamicamente.vect
nesse caso, é alocado na pilha, porque você a definiu como uma variável de pilha local.fonte
vector tem um interno
allocator
que é responsável por alocar / desalocar memórias deheap
para ovector element
. Portanto, não importa como você crie um vetor, eleelement
sempre será alocado noheap
. Quanto aos metadados do vetor, isso depende da maneira como você os cria.fonte