Einige andere Antworten sagen im Grunde genommen "sc wird auf dem Stapel allokiert, new allokiert das Objekt auf dem Heap". Ich ziehe es vor, nicht auf diese Weise darüber nachzudenken, da es Implementierungsdetails (Stapel/Heap) mit der Semantik des Codes vermischt. Da du daran gewöhnt bist, wie Dinge in C# gemacht werden, denke ich, dass es auch Unklarheiten schafft. Stattdessen bevorzuge ich es, darüber nachzudenken, wie es im C++-Standard beschrieben wird:
sc ist eine Variable vom Typ SomeClass, die im Blockumfang deklariert ist (d. h. die Klammern, die die Hauptfunktion bilden). Dies wird als lokale Variable bezeichnet. Da sie nicht als static
oder extern
deklariert ist, hat sie automatische Speicherdauer. Was dies bedeutet ist, dass immer wenn die Zeile SomeClass sc;
ausgeführt wird, die Variable initialisiert wird (indem ihr Konstruktor ausgeführt wird), und wenn die Variable den Block verlässt, wird sie zerstört (indem ihr Destruktor ausgeführt wird - da du nicht einen hast und dein Objekt einfach alte Daten sind, wird nichts getan).
Früher sagte ich "Da es nicht als static
oder extern
deklariert ist", wenn du es so deklariert hättest, hätte es statische Speicherdauer. Es würde vor dem Programmstart initialisiert werden (technisch gesehen würde es im Blockumfang beim ersten Gebrauch initialisiert werden), und nach Programmende zerstört werden.
Wenn du new
verwendest, um ein Objekt zu erstellen, erstellst du ein Objekt mit dynamischer Speicherdauer. Dieses Objekt wird initialisiert, wenn du new
aufrufst, und wird nur zerstört, wenn du delete
darauf aufrufst. Um delete aufzurufen, musst du eine Referenz darauf aufrechterhalten und delete aufrufen, wenn du fertig bist, das Objekt zu verwenden. Gut geschriebener C++-Code verwendet typischerweise diese Art von Speicherdauer nicht sehr oft. Stattdessen legst du typischerweise Wertobjekte in Container (z. B. std::vector
), die die Lebensdauer der enthaltenen Werte verwalten. Die Container-Variable selbst kann im statischen oder im automatischen Speicher platziert werden.
Hoffentlich hilft dir das, die Dinge ein wenig zu entwirren, ohne zu viele neue Begriffe zu verwenden, um dich zu verwirren.