Was ist in C ++ der Unterschied zwischen den Deklarationen node * temp und node * temp = new node, wobei node eine Struktur ist, die 2 Datenelemente enthält und next?


Antwort 1:

Ich gehe davon aus, dass diese beiden Deklarationen für lokale oder statische Variablen gelten. Die erste deklariert lediglich eine Variable namens "temp", deren Typ "Zeiger auf Knoten" ist, aber sie nicht initialisiert. Die zweite deklariert dieselbe Variable, initialisiert sie jedoch mit einem Zeiger auf eine auf dem Heap zugewiesene Knotenstruktur.

Es ist immer vorzuziehen, Variablen zu initialisieren, anstatt sie nicht zu initialisieren. Selbst wenn Sie die Variable an einer anderen Stelle im Code festlegen, ist es normalerweise am besten, sie in der Deklaration auf null zu setzen (node ​​* temp = nullptr), da dies das Debuggen erleichtert.


Antwort 2:

Knoten * Temp; Erstellt einen initialisierten Zeiger auf den Knoten. Zu einem späteren Zeitpunkt können Sie ihm möglicherweise die Adresse eines Knotens zuweisen. Dieser Knoten müsste bereits existieren. Sie können den Zeiger den Gültigkeitsbereich verlassen lassen, ohne den Knoten zu verlieren, da er eindeutig getrennt vom Zeiger vorhanden ist.

knoten * temp = neuer knoten; reserviert Speicher für und ruft den Konstruktor auf, um ein neues Knotenobjekt zu initialisieren. Der einzige Verweis auf diesen Knoten ist der Zeiger. Wenn der Zeiger den Gültigkeitsbereich verlässt, verliert der Knoten, das heißt, er ist immer noch vorhanden, belegt immer noch Speicherplatz, ist jedoch in keiner Weise zugänglich. Bevor der Zeiger den Gültigkeitsbereich verlässt, sollten Sie den Knoten löschen, auf den er zeigt, um dies zu vermeiden.

Nächstes Thema: Smart Pointer. C ++ 11 und höher hat sie in der Sprache. Davor war es ziemlich einfach, selbst zu rollen. Ein Smart Pointer ist ein Objekt einer Klasse mit einem Konstruktor und einem Destruktor. Wenn der intelligente Zeiger den Gültigkeitsbereich verlässt, wird sein Destruktor aufgerufen, und der Destruktor löscht das Objekt, das dem Zeiger gehört. Selbst wenn der Code beendet wird, weil eine Ausnahme ausgelöst wurde, verhindern intelligente Zeiger Lecks.