Pouvez-vous déclarer un pointeur sur le tas?
-
16-09-2019 - |
Question
Ceci est le procédé de création d'une variable sur le tas en C ++:
T *ptr = new T;
ptr fait référence à un pointeur vers la nouvelle T, évidemment. Ma question est, pouvez-vous faire ceci:
T *ptr = new T*;
Cela semble que cela pourrait conduire à un code très, très dangereux. Est-ce que quelqu'un sait si cela est possible / comment l'utiliser correctement?
La solution
int** ppint = new int*;
*ppint = new int;
delete *ppint;
delete ppint;
Autres conseils
new T*
renvoie un pointeur sur un pointeur vers un T. Donc, la déclaration n'est pas correcte, il devrait être:
T** ptr = new T*;
Et il sera sur le tas.
Oui, vous pouvez déclarer un pointeur vers un pointeur ... et oui, le pointeur sera sur le tas.
Il a été mentionné que la raison pour laquelle vous pourriez avoir besoin de quelque chose comme ça. La seule chose qui vient à l'esprit est un tableau dynamique. (La plupart des implémentations de vecteurs utilisent ce fait.)
// 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
En conséquence, nous copions un tas de conseils pour augmenter notre gamme, et non les objets eux-mêmes.
Vous ne pouvez pas faire
T *ptr = new T*;
puisque le type de retour de new foo
est "pointeur vers foo" ou foo *
.
Vous pouvez faire
T **ptr = new T*;