我有以下C ++代码:
struct B {
int c;
int d;
}
struct A {
int a;
B x;
}
int main() {
A * ptr = new A;
ptr->a = 1;
ptr->x.c = 2;
ptr->x.d = 23;
// a lot of lines of codes later ...
// Will the following values be guranteed?
cout << ptr->x.c << endl;
cout << ptr->x.d << endl;
}
在堆上声明一个新的“struct A”后,ptr-> x会在堆栈或堆上声明吗?如果我希望x在堆上,我必须将属性x声明为指针(因此,用“new”初始化它)?
答案 0 :(得分:6)
x
是A
的成员。它实际上是每个A
对象的一部分,类似于你的手臂在身体上的一部分。因此,A
对象位于堆栈,堆或其他任何位置的任何位置,即x
成员所在的位置。所以回答这个问题:
如果我希望x在堆上,我必须将属性x声明为指针(因此,使用&#34; new&#34;初始化它)?
没有。如果拥有它的A
在堆上,它将在堆上。
答案 1 :(得分:1)
ptr->x
将在堆上。
这是因为当您创建A
的实例时,它将为其所有成员分配足够的内存。其中包括B
类型的成员。