Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆分配类的成员是否在堆中自动分配?_C++_Heap_Allocation - Fatal编程技术网

C++ 堆分配类的成员是否在堆中自动分配?

C++ 堆分配类的成员是否在堆中自动分配?,c++,heap,allocation,C++,Heap,Allocation,假设我有: class A{ public: int x; int y; }; 我分配了一个实例,如下所示: A *a = new A(); a.x和a.y是否也在堆中分配,因为它们“依赖”于堆分配的对象 谢谢。您将在包含x和y的堆上获得一个分配A是引用该对象的好方法 我希望我可以轻松地利用堆栈溢出,但您可以像下面这样(非常小的)堆示例: +-------------------------------+ | He

假设我有:

class A{
    public:
    int x;
    int y;
};
我分配了一个实例,如下所示:

A *a = new A();
a.x和a.y是否也在堆中分配,因为它们“依赖”于堆分配的对象


谢谢。

您将在包含
x
y
的堆上获得一个分配
A
是引用该对象的好方法

我希望我可以轻松地利用堆栈溢出,但您可以像下面这样(非常小的)堆示例:

        +-------------------------------+
        |            Heap               | 
        +-------------------------------+
        | Other memory here ...         | 
        +-------+-----------------------+
A *a -> | x | y | Other memory here ... |
        +-------+-----------------------+

<> P>了解C++使用“复制语义”是很重要的。这意味着变量和结构字段不包含对值的引用,而是包含值本身

当你申报时

struct A
{
    int x;
    double yarr[20];
};
您将创建的每个
A
将包含一个整数和一个包含20个双精度的数组。。。例如,它的字节大小将是
sizeof(int)+20*sizeof(double)
,出于对齐的原因,可能会更大

当您在堆上分配对象
A
时,所有这些字节都将在堆中,当您在堆栈上创建
A
时,所有这些字节都将在堆栈中

当然,结构也可以包含指向其他对象的指针,在这种情况下,指向的内存可能位于其他对象。。。例如:

struct B
{
   int x;
   double *yarr;
};
在这种情况下,结构
B
包含一个整数和一个指向一个双精度数组的指针
B
的内存大小是
sizeof(int)+sizeof(double*)
,可能更大一些。 当您分配
B
的实例时,构造函数将决定从何处分配
yarr
指向的内存

例如,标准类std::vector非常小(通常只有三个指针),并且将所有元素保留在堆上。

我的意思是A*A=newa()。抱歉。dup:可能是的副本