12 Stimmen

Kann man einen Zeiger auf dem Heap deklarieren?

Dies ist die Methode zur Erstellung einer Variablen auf dem Heap in C++:

T *ptr = new T;

ptr bezieht sich natürlich auf einen Zeiger auf das neue T. Meine Frage ist, können Sie dies tun:

T *ptr = new T*;

Das könnte zu einem sehr, sehr gefährlichen Code führen. Weiß jemand, ob dies möglich ist / wie man es richtig zu verwenden?

37voto

Khaled Alshaya Punkte 90854
int** ppint = new int*;
*ppint = new int;

delete *ppint;
delete ppint;

7voto

Tamás Szelei Punkte 22099

new T* gibt einen Zeiger auf einen Zeiger auf ein T zurück. Die Deklaration ist also nicht korrekt, sie sollte es sein:

T** ptr = new T*;

Und es wird auf dem Haufen liegen.

4voto

jsight Punkte 27087

Ja, Sie können einen Zeiger auf einen Zeiger deklarieren... und ja, der Zeiger wird auf dem Heap sein.

4voto

Zeroshade Punkte 399

Es wurde erwähnt, warum Sie so etwas brauchen könnten. Die Sache, die in den Sinn kommt, ist ein dynamisches Array. (Die meisten Vektor-Implementierungen verwenden dies tatsächlich.)

// 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

Das Ergebnis ist, dass wir eine Reihe von Zeigern kopieren, um unser Array zu vergrößern, nicht die Objekte selbst.

2voto

David Thornley Punkte 55244

Das können Sie nicht tun

T *ptr = new T*;

da der Rückgabetyp von new foo ist "Zeiger auf foo" oder foo * .

Das können Sie tun

T **ptr = new T*;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X