2010-05-12 12 views
8

Wenn eine Klasse erklärt sich wie folgt:Zuordnung von Klassenmitgliedern auf Heap/Stack?

class MyClass 
{ 
    char * MyMember; 
    MyClass() 
    { 
    MyMember = new char[250]; 
    } 
    ~MyClass() 
    { 
    delete[] MyMember; 
    } 
}; 

Und es könnte wie folgt geschehen:

class MyClass 
{ 
    char MyMember[250]; 
}; 

Wie eine Klasse auf Heap zugewiesen wird, wie wenn ich MyClass * Mine = new MyClass(); tun die zugewiesene Hat Speicher reserviert auch die 250 Bytes im zweiten Beispiel zusammen mit der Klasseninstanziierung? Und wird das Mitglied für die gesamte Lebensdauer des MyClass-Objekts gültig sein? Wie für das erste Beispiel ist es praktisch, Klassenmitglieder auf Heap zuzuweisen?

+0

Mögliches Duplikat [Klassen Mitglieder und expliziten Stapel/Heapzuordnung] (https://stackoverflow.com/questions/10836591/class-members-and-explicit-stack-heap- Zuweisung) –

Antwort

7

Ja, ja und ja.

Ihr erstes Beispiel hat jedoch ein bisschen einen Fehler: was ist, weil es eines seiner Daten Mitglieder ist ein Zeiger mit Heap-allokierten Daten, dann sollte es auch einen Kopie-Konstruktor und Zuweisungsoperator, zum Beispiel wie ...

MyClass(const MyClass& rhs) 
{ 
    MyMember = new char[250]; 
    memcpy(MyMember, rhs.MyMember, 250); 
} 
+0

Danke für den Tipp, ich werde diese Technik öfter anwenden. – SimpleButPerfect

+2

Obwohl Chris technisch korrekt ist, ist es keine gute Idee, dies zu tun. Verwenden Sie stattdessen einen std :: vector und Sie kümmern sich um Ihre gesamte Speicherverwaltung. Um alle Details zu sehen: http://StackOverflow.com/Questions/255612/c-dynamically-allocating-an-array-of-Objects/255744#255744 –

+1

Die Frage war nicht über Arrays überhaupt, ich sollte geändert haben In diesem Beispiel ging es um das Konzept der Allokation selbst. – SimpleButPerfect

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 wird Speicherplatz in beiden 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 Byte auf dem Stack für die Instanz von MyClass zugewiesen. In diesem Fall wird MyMember als Offset in die Instanz behandelt.

+1

Das ist nicht wirklich richtig, im zweiten Beispiel enthält die Klasse ein Array von 250 Zeichen.alles wird auf dem Heap, wenn Sie so etwas wie 'MyClass * foo = new MyClass tun;' – Hasturkun

+0

Ah - ich nicht die 'neue MyClass' (oder vielleicht der OP es in den„Änderungen nicht erhalten bemerkt“, fügte sah Zeitrahmen). Diese Antwort ist also überhaupt nicht korrekt, wie die Frage steht. Aber leider kann ich es nicht löschen. – Anon

3

Frühe Anmerkung: Verwenden Sie std::string anstelle eines Heap zugewiesenen char [].

Hat der zugewiesene Speicher reserviert auch das 250 Bytes in dem zweiten Beispiel zusammen mit der Klasse Instanziierung?

Es wird im Konstruktor gehäuft zugeordnet, genau wie in einem Stapel, der MyClass zugeordnet 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 für das erste Beispiel ist es praktisch, Klassenmitglieder auf Heap zuzuweisen?

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.

+0

Vielen Dank für so eine ausführliche Antwort, denn für die frühe Notiz versuche ich nur, Wissen über das Thema zu sammeln. – SimpleButPerfect

Verwandte Themen