堆栈或堆上的成员值?

时间:2013-11-18 05:14:42

标签: c++ memory-management stack heap

这可能是重复的。但是,我找不到一个。

的疑问:

让我们假设A级和B级。

如果我这样做。

A* aPtr = new A;  //This is an heap allocation

如果我这样做

B bObj; //This is stack allocatio

如果我有一个C类,它同时具有A和B obj,那该怎么办。

class C
{
   A aObj;
   B bObj;
};

如果C的分配是这样的:

C *cptr = new C; //here memory allocation for cptr is heap. 
                 //But, what about aObj and bObj, which are not heap allocated?

aObj和bObj都是在堆上分配的,虽然它们看起来像堆栈对象吗?

3 个答案:

答案 0 :(得分:3)

在裁判到C ++时,我个人讨厌“堆”和“堆栈”这个词,因为C ++标准没有强制执行内存分配的位置。所有标准保证都是释放内存的时间。

因此,我更喜欢名称Dynamic memory allocationAutomatic memory allocation来区分这两者。

当超出范围或删除其所在对象时,将删除自动内存分配。

在代码中显式释放动态内存分配时,将删除它。

C *cptr = new C;之类的东西是使用动态内存分配分配的,需要在程序结束之前删除,否则你将有未定义的行为。

将使用自动存储器分配B bObj;,并在删除其所在的对象时删除。

答案 1 :(得分:1)

aObjbObj是堆上C实例的成员。所以是的,cpt->aObjcpt->bObj在堆上。

如果相反,你有

C c;

然后c.aObj在堆栈上,c.bObj在堆栈上。

答案 2 :(得分:1)

在C类声明中,成员A和B也是声明。使用operator [new],指针cptr将在堆中分配,成员也将在堆中。