Zuweisung von Klassenmitgliedern auf Heap / Stack?

8

Wenn eine Klasse wie folgt deklariert ist:

%Vor%

Und es könnte so gemacht werden:

%Vor%

Wie wird eine Klasse auf dem Heap zugewiesen, wie wenn ich MyClass * Mine = new MyClass(); mache Ordnet der allozierte Speicher auch die 250 Bytes im zweiten Beispiel zusammen mit der Klasseninstanziierung zu? Und wird das Mitglied für die gesamte Lebensdauer des MyClass-Objekts gültig sein? Was das erste Beispiel angeht, ist es praktisch, Klassenmitglieder auf Heap zuzuordnen?

    
SimpleButPerfect 12.05.2010, 15:51
quelle

3 Antworten

7

Ja, ja und ja.

Ihr erstes Beispiel enthält jedoch einen kleinen Fehler: Da es sich bei einem seiner Datenelemente um einen Zeiger mit Heap-allokierten Daten handelt, sollte es auch einen Kopierkonstruktor und einen Zuweisungsoperator für z Beispiel wie ...

%Vor%     
ChrisW 12.05.2010, 15:56
quelle
3

Früher Hinweis: Verwenden Sie std::string anstelle eines Heap zugewiesenen char [].

  

Weist der allozierte Speicher auch die 250 Bytes im zweiten Beispiel zusammen mit der Klasseninstanziierung zu?

Es wird gehäuft im Konstruktor zugewiesen, genauso wie in einem Stapel, der MyClass zugewiesen ist. Es hängt davon ab, was Sie mit "zusammen mit" meinen, es wird nicht unbedingt zusammen zugeordnet.

  

Und wird das Mitglied für die gesamte Lebensdauer des MyClass-Objekts gültig sein?

Ja.

  

Wie ist es für das erste Beispiel praktisch, Klassenmitglieder auf Heap zuzuordnen?

Ja, in bestimmten Fällen. Manchmal möchten Sie die Includes aus der Header-Datei minimieren, und manchmal verwenden Sie eine Factory-Funktion, um das Member zu erstellen. Normalerweise gehe ich jedoch mit einem einfachen Nicht-Zeiger-Mitglied.

    
Stephen 12.05.2010 15:55
quelle
1

Wenn Sie new aufrufen, wird es vom Heap zugewiesen, andernfalls wird es vom Stack zugewiesen (wir ignorieren malloc und seine Art).

In Ihrem ersten Beispiel ist in beiden Fällen Platz zugewiesen: 4 Byte im Stapel für die Instanz von MyClass (32-Bit-Zeiger vorausgesetzt) ​​und 250 Byte im Heap für den Puffer, der MyMember zugewiesen ist.

Im zweiten Beispiel werden 250 Bytes auf dem Stack für die Instanz von MyClass reserviert. In diesem Fall wird MyMember als Offset in die Instanz behandelt.

    
Anon 12.05.2010 15:55
quelle

Tags und Links