假设我们有 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 分配在堆上。这里会发生什么?这两部分是否在内存中分开?如果我从析构函数中删除了“删除 m_D”并且 myC1 超出范围,那么在堆上为 m_D 分配的空间是否会出现内存泄漏?
如果有任何教程/文章详细介绍了这个,我会喜欢一个链接。