假设我们有以下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在堆上分配。这里会发生什么?这两个部分是否跨越内存分开?如果我从析构函数中删除'delete m_D',并且myC1超出范围,那么分配给m_D的堆空间是否会有内存泄漏?
如果有任何详细介绍此内容的教程/文章,我非常希望得到一个链接。