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?

Était-ce utile?

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*;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top