você pode declarar um ponteiro na pilha?
-
16-09-2019 - |
Pergunta
Este é o método para a criação de uma variável sobre o montão em C ++:
T *ptr = new T;
ptr refere-se a um ponteiro para o novo T, obviamente. A minha pergunta é, você pode fazer isso:
T *ptr = new T*;
Isso parece que poderia levar a um código muito, muito perigoso. Alguém sabe se isso é possível / como usá-lo corretamente?
Solução
int** ppint = new int*;
*ppint = new int;
delete *ppint;
delete ppint;
Outras dicas
new T*
retorna um ponteiro para um ponteiro para um T. Assim, a declaração não está correta, ele deve ser:
T** ptr = new T*;
E vai residir no heap.
Sim, você pode declarar um ponteiro para um ponteiro ... e sim, o ponteiro será na pilha.
Foi mencionado como por que você pode precisar de algo assim. A única coisa que vem à mente é uma matriz dinâmica. (A maioria das implementações vetor usar este fato.)
// Create array of pointers to object
int start = 10;
SomeObject** dynamic = new SomeObject*[start];
// stuff happens and it gets filled
// we need it to be bigger
{
SomeObject** tmp = new SomeObject*[start * 2];
for (size_t x = 0; x < start; ++x)
tmp[x] = dynamic[x];
delete [] dynamic;
dynamic = tmp;
}
// now our dynamic array is twice the size
Como resultado, nós copiar um monte de ponteiros para aumentar a nossa matriz, não a si mesmos objetos.
Você não pode fazer
T *ptr = new T*;
desde o tipo de retorno de new foo
é "ponteiro para foo" ou foo *
.
Você pode fazer
T **ptr = new T*;