Angenommen, wir haben 4 Klassen wie folgt:
class A
{
public:
A(void) : m_B()
{
}
private:
B m_B;
}
class B
{
public:
B(void)
{
m_i = 1;
}
private:
int m_i;
}
class C
{
public:
C(void)
{
m_D = new D();
}
~C(void)
{
delete m_D;
}
private:
D *m_D;
}
class D
{
public:
D(void)
{
m_i = 1;
}
private:
int m_i;
}
Angenommen es gibt 4 Fälle:
Fall 1: A extern auf dem Stack allokiert, B intern auf dem Stack allokiert
A myA1;
Fall 2: A extern auf dem Heap allokiert, B intern auf dem Stack allokiert
A *myA2 = new A();
Fall 3: C extern auf dem Stack allokiert, D intern auf dem Heap allokiert
C myC1;
Fall 4: C extern auf dem Heap allokiert, D intern auf dem Heap allokiert
C *myC2 = new C();
Was passiert in jedem dieser Fälle? Zum Beispiel, im Fall 2, verstehe ich, dass der Zeiger myA2 auf dem Stack allokiert ist, das A-Objekt existiert im Heap, aber was ist mit dem Attribut m_B? Ich nehme an, dass auch Speicherplatz im Heap dafür allokiert wird, da es keinen Sinn hätte, dass ein Objekt im Heap existiert und dann sein Attribut außerhalb des Geltungsbereichs liegt. Wenn das stimmt, bedeutet das dann, dass die externe Heap-Allokation die interne Stack-Allokation überschreibt?
Was ist mit Fall 3, myC1 wird auf dem Stack allokiert, jedoch wird m_D auf dem Heap allokiert. Was passiert hier? Sind die beiden Teile über den Speicher verteilt? Wenn ich 'delete m_D' aus dem Destruktor entfernen würde und myC1 außerhalb des Geltungsbereichs wäre, gäbe es dann ein Memory Leak für den im Heap allokierten Speicher für m_D?
Wenn es Tutorials/Artikel gibt, die dies ausführlich behandeln, würde ich mich über einen Link freuen.