【问题标题】:C++: When there's an object inside another object created using constructor, does that inner object live in the stack or the heap?C ++:当使用构造函数创建的另一个对象内部有一个对象时,该内部对象是位于堆栈还是堆中?
【发布时间】:2017-02-18 22:06:13
【问题描述】:

我想知道从构造函数(通过“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 对象是在堆栈还是堆内创建的。 基本上:当一个对象在堆中创建时,其成员变量中的所有内部对象也会在堆中创建吗?

谢谢!

【问题讨论】:

  • 它位于外部对象所在的位置 IIRC。

标签: heap-memory stack-memory


【解决方案1】:

->. 与元素是否位于堆或堆栈无关。当你有一个指针时使用->,当你有一个对象时使用.。您可以在堆栈上创建一个结构并使用指针访问其值:

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() 将是构造函数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 2012-07-06
        • 2021-07-10
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多