C ++指针对象位置

时间:2015-06-08 08:27:41

标签: c++ heap-memory stack-memory

我有以下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”初始化它)?

2 个答案:

答案 0 :(得分:6)

xA的成员。它实际上是每个A对象的一部分,类似于你的手臂在身体上的一部分。因此,A对象位于堆栈,堆或其他任何位置的任何位置,即x成员所在的位置。所以回答这个问题:

  

如果我希望x在堆上,我必须将属性x声明为指针(因此,使用&#34; new&#34;初始化它)?

没有。如果拥有它的A在堆上,它将在堆上。

答案 1 :(得分:1)

ptr->x将在堆上。

这是因为当您创建A的实例时,它将为其所有成员分配足够的内存。其中包括B类型的成员。