这可能是重复的。但是,我找不到一个。
的疑问:
让我们假设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都是在堆上分配的,虽然它们看起来像堆栈对象吗?
答案 0 :(得分:3)
在裁判到C ++时,我个人讨厌“堆”和“堆栈”这个词,因为C ++标准没有强制执行内存分配的位置。所有标准保证都是释放内存的时间。
因此,我更喜欢名称Dynamic memory allocation
和Automatic memory allocation
来区分这两者。
当超出范围或删除其所在对象时,将删除自动内存分配。
在代码中显式释放动态内存分配时,将删除它。
像C *cptr = new C;
之类的东西是使用动态内存分配分配的,需要在程序结束之前删除,否则你将有未定义的行为。
将使用自动存储器分配B bObj;
,并在删除其所在的对象时删除。
答案 1 :(得分:1)
aObj
和bObj
是堆上C
实例的成员。所以是的,cpt->aObj
和cpt->bObj
在堆上。
如果相反,你有
C c;
然后c.aObj
在堆栈上,c.bObj
在堆栈上。
答案 2 :(得分:1)
在C类声明中,成员A和B也是声明。使用operator [new],指针cptr将在堆中分配,成员也将在堆中。