C++:当使用构造函数创建的另一个对象中有一个对象时,该内部对象是在堆栈中还是在堆中?

C++: When there's an object inside another object created using constructor, does that inner object live in the stack or the heap?

我想知道从构造函数(通过 "new" 关键字)创建的结构中的结构存在于何处:是在堆栈中还是在堆中? 假设我有这些定义来创建一个单链表:

struct Employee{
   int code;
   string name;
   double wage;
};

struct Node {
    Employee employee;
    Node* next;
};

每当我创建一个指向 Node 的指针然后将 new Node() 分配给它时,我知道我正在堆中创建一个 Node 对象,并且可以使用 -> 运算符取消引用它的字段。但是当我尝试访问内部结构的字段时,我需要使用点 (.) 运算符,例如:

Node* pointer = new Node();
pointer->employee.name="John Doe";

所以这让我想知道 Employee 对象是在堆栈还是堆中创建的。 基本上:当在堆中创建一个对象时,其成员变量中的所有内部对象是否也在堆中创建?

谢谢!

->. 与元素是在堆上还是在栈上无关。当你有一个 pointer 时使用 ->,当你有 object 时使用 .。您可以在堆栈上创建一个结构并使用指针访问它的值:

struct Foo
{
  int i;
};
Foo f; // object on stack
f.i = 5; // access object
Foo* p_f = &f; // get pointer to address of object (which is still on the stack)
p_f->i = 3; // access object through pointer

回答你的问题:pointer 指向的节点存在于堆中,字符串 pointer->employee.name.

也存在于堆中

请注意,new 不是构造函数,函数 Node() 是构造函数。

还在堆里! 'new' 操作将在堆上 malloc 大约 sizeof(Node) 字节,它等于 sizeof(Employee)+sizeof(Node*),所以 name 在堆上。 你应该知道'。只是 C/C++ 编译器访问某些成员的一种方式,它对堆或堆栈的内存没有任何作用。

任何 new 都存在于堆中,必须通过调用 delete 显式释放。其他一切都在堆栈中。