在 C++ 中,堆分配对象内的堆栈对象在哪里分配?
Posted
技术标签:
【中文标题】在 C++ 中,堆分配对象内的堆栈对象在哪里分配?【英文标题】:Where does a stack object inside a heap allocated object gets allocated in c++? 【发布时间】:2018-09-07 08:27:27 【问题描述】:我有两个班级Class A
和Class B
。
class A
int width;
int height;
;
class B
A obj;
;
我正在尝试创建如下所示的指针
B* myObj = new B();
这里,myObj
在堆中创建。 obj
、width
和 height
是在哪里创建的?
【问题讨论】:
myObj
将在堆栈上创建,但它的地址将指向堆上的地址
你不能在用户代码中使用new
!请改用std::make_shared
或std::make_unique
:auto my_obj std::make_unique<B>() ;
myObj
不是 B
类型的对象。它是一个类型为指向B
的对象。
C++,和其他语言一样,does not define a "Stack" or "Heap"
【参考方案1】:
指向对象的指针,在您的程序中称为myObj
,是在堆栈上创建的。
对象本身B()
是在堆上创建的。 width
和 height
包含在 B()
占用的内存中,因此也在堆上。
在 Ascii 艺术中:
Stack --- myObj
|
Heap [ B -- A [ Width, Height ] ]
【讨论】:
【参考方案2】:对象可以包含其他对象,称为子对象。子对象可以是成员子对象、基类子对象或数组元素。
[intro.object]
子对象和引用成员的存储时间是其完整对象的存储时间
[basic.stc]
myObj
指向的B
对象的成员都包含在该B
对象中,并且它们都具有相同的(动态)存储持续时间。
【讨论】:
以上是关于在 C++ 中,堆分配对象内的堆栈对象在哪里分配?的主要内容,如果未能解决你的问题,请参考以下文章