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:可能是的副本