次のように 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: スタックに外部的に割り当てられた A、スタックに内部的に割り当てられた B
A myA1;
ケース 2: A はヒープに外部的に割り当てられ、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 はヒープに割り当てられます。そこで何が起こるの?2 つの部分はメモリ間で分割されていますか? デストラクタから 'delete m_D' を削除し、myC1 が範囲外になった場合、m_D のヒープに割り当てられたスペースでメモリ リークが発生しますか?
これを詳しく説明しているチュートリアル/記事があれば、リンクが大好きです。