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
显式释放。其他一切都在堆栈中。
我想知道从构造函数(通过 "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
显式释放。其他一切都在堆栈中。