在 C++ 中,堆分配对象内的堆栈对象在哪里分配?

Posted

技术标签:

【中文标题】在 C++ 中,堆分配对象内的堆栈对象在哪里分配?【英文标题】:Where does a stack object inside a heap allocated object gets allocated in c++? 【发布时间】:2018-09-07 08:27:27 【问题描述】:

我有两个班级Class AClass B

class A

  int width;
  int height;  

;

class B

  A obj;

;

我正在尝试创建如下所示的指针

B* myObj = new B();

这里,myObj 在堆中创建。 objwidthheight 是在哪里创建的?

【问题讨论】:

myObj 将在堆栈上创建,但它的地址将指向堆上的地址 你不能在用户代码中使用new!请改用std::make_sharedstd::make_uniqueauto my_obj std::make_unique<B>() ; myObj 不是 B 类型的对象。它是一个类型为指向B的对象。 C++,和其他语言一样,does not define a "Stack" or "Heap" 【参考方案1】:

指向对象的指针,在您的程序中称为myObj,是在堆栈上创建的。

对象本身B() 是在堆上创建的。 widthheight 包含在 B() 占用的内存中,因此也在堆上。

在 Ascii 艺术中:

Stack --- myObj
            |
Heap      [ B -- A [ Width, Height ] ]

【讨论】:

【参考方案2】:

对象可以包含其他对象,称为子对象。子对象可以是成员子对象、基类子对象或数组元素。

[intro.object]

子对象和引用成员的存储时间是其完整对象的存储时间

[basic.stc]

myObj 指向的B 对象的成员都包含在该B 对象中,并且它们都具有相同的(动态)存储持续时间。

【讨论】:

以上是关于在 C++ 中,堆分配对象内的堆栈对象在哪里分配?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL 内存管理:堆栈还是堆?

C++ 堆栈与堆分配

Java 堆栈内存分配

Java 堆栈内存分配

JVM 关于对象分配在堆栈TLAB的理解

JVM 关于对象分配在堆栈TLAB的理解