Скажем, мы имеем 4 класса следующим образом:
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;
}
Допустим, что существует 4 случая:
случай 1: внешнее выделение в стеке, B, внутренне выделенное в стеке
A myA1;
случай 2: внешнее выделение в куче, B внутренне выделено в стеке
A *myA2 = new A();
случай 3: C, выделенный извне в стеке, D, выделенный внутри кучи
C myC1;
случай 4: C, выделенный извне в куче, D, выделенный внутри кучи
C *myC2 = new C();
Что происходит в каждом из этих случаев? Например, в случае 2 я понимаю, что указатель myA2 выделен в стеке, объект A существует в куче, но как насчет атрибута m_B? Я предполагаю, что пространство на куче выделено для него, потому что не имеет смысла, чтобы объект существовал в кучном пространстве, а затем его атрибут выходит за пределы области видимости. Если это так, то означает ли это, что внешнее распределение кучи переопределяет распределение внутреннего стека?
Как насчет случая 3, myC1 выделяется в стеке, однако m_D выделяется в куче. Что здесь происходит? Разделяются ли две части по памяти? Если я удалил "delete m_D" из деструктора, а myC1 вышел из области видимости, будет ли утечка памяти для пространства, выделенного в куче для m_D?
Если есть какие-то учебники/статьи, которые подробно описывают это, мне бы понравилась ссылка.