3 Stimmen

C++ Klassenmember-Speicherung

Ich habe gerade eine Frage zur Speicherung von C ++ Klassenmitgliedern erhalten.

Zum Beispiel habe ich eine Klasse wie diese:

class MyClass1{
    int a;
    int b[4];
    int c;
}

In der Hauptfunktion:

int main(){
    MyClass1 class1;
    MyClass1* class_ptr1= new MyClass1();
}

Wie werden die Mitglieder a, b, c gespeichert? Für class1 denke ich, dass alle Mitglieder mit einem Platz im Stapel allokiert sind, auch das Array b.

Und was ist mit class_ptr1? Offensichtlich wird es dynamisch allokiert, werden die Mitglieder auch dynamisch allokiert, auch wenn sie keine Zeiger sind.

Vielen Dank.

Vielen Dank für die Antworten. Jetzt verstehe ich, dass sobald die Klasse dynamisch allokiert ist, auch alle ihre Mitglieder dynamisch allokiert werden. In diesem Fall muss ich etwas tun, um sie freizugeben, wenn ich die Klasse nicht mehr benutze? Soll ich einfach:

delete(class_ptr1);

oder muss ich zuerst ihre Mitglieder freigeben.

6voto

Slava Punkte 42033

Deine Frage kommt daher, dass du nicht ganz verstehst, was die Klasse/Struktur in C++ ist. Wenn du eine Klasse deklarierst:

class MyClass1{
    int a;
    int b[4];
    int c;
};

wird jede Instanz dieser Klasse einen zusammenhängenden Speicherblock der Größe sizeof(MyClass1) sein, wobei jedes Feld einen bestimmten Offset vom Beginn dieses Blocks haben wird. Wenn du darüber nachdenkst und es verstehst, wird die Antwort auf deine Frage offensichtlich sein.

1voto

Luchian Grigore Punkte 244505

In dem ersten Fall befinden sich das Objekt und seine Elemente im automatischen Speicher.

In dem zweiten Fall befinden sich das Objekt und seine Elemente im dynamischen Speicher.

Sie können diese auch trivialerweise als Stapel und Heap bezeichnen, ja.

1voto

Der Speicherlayout der beiden Instanzen, class1 und *class_ptr1, ist gleich, sie befinden sich nur an verschiedenen Speicherstellen - class1 auf dem Stack, *class_ptr1 im Heap.

1voto

Bill Lynch Punkte 76551
  • Wenn Sie class1 erstellt haben, hat der Compiler etwa 24 Bytes auf dem Stapel reserviert, um dieses Objekt zu platzieren.
  • Wenn Sie class_ptr1 erstellt haben, hat der Aufruf von new() etwa 24 Bytes aus dem Heap alloziert, um dieses Objekt zu platzieren.

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