C++ stack-Variablen und heap-Variablen
Wenn Sie ein neues Objekt erstellen in C++, das Leben auf dem stack (den Weg dorthin habe ich meistens gesehen) Sie das tun:
CDPlayer player;
Beim erstellen eines Objekts auf dem heap rufen Sie new
:
CDPlayer* player = new CDPlayer();
Aber wenn Sie dies tun:
CDPlayer player=CDPlayer();
schafft es einen stack-basierten Objekt, aber was ist der Unterschied zwischen diesem und dem oberen Beispiel?
- möglich, Duplikat der Tun die Klammern nach dem Typnamen einen Unterschied machen mit dem neuen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist wichtig, mit Hülsen (im Grunde alle built-in Typen wie
int
,bool
,double
etc. plus C-wie structs und unions gebaut, nur aus anderen PODs), für die es einen Unterschied zwischen default-Initialisierung und Wert-Initialisierung. Für Hülsen, eine einfacheverlassen
obj
nicht initialisiert, währendT()
default-initialisiert das Objekt. Soist ein guter Weg, um sicherzustellen, dass ein Objekt ordnungsgemäß initialisiert.
Dies ist besonders hilfreich bei der template-code, wo
T
könnte entweder ein POD oder ein nicht-POD-Typ. Wenn Sie wissen, dassT
ist nicht ein POD-Typ,T obj;
genügt.Nachtrag: kann Man auch schreiben
(und vermeiden Initialisierung des zugewiesenen Objekts, wenn
T
ist ein POD).T obj{};
.T obj = T()
erfordert, dass der copy-Konstruktor vorhanden ist (auch wenn der compiler zu umgehen, aber die Kopie).Nicht unbedingt auf den stack: Variablen, die in dieser Weise haben automatische Speicherung. Wo Sie tatsächlich gehen wird, hängt. Kann es auf dem stack (insbesondere, wenn die Erklärung innerhalb einer Methode), aber es kann auch woanders sein.
Betrachten wir den Fall, wo die Deklaration innerhalb einer Klasse:
Nun die Lagerung von
x
ist, wo immer die Instanz der Klasse gespeichert wird. Wenn es gespeichert ist auf dem heap, so istx
:Was dies tatsächlich tut, ist erstellen Sie einen Zeiger auf dem stack und macht Sie zu einem CD-Player zugeordnete Objekte auf dem heap.