C++中堆分配类对象及其数据成员的内存分配疑问
问题
我们主要有栈(stack)和堆(heap)两种内存区域。当创建一个堆分配的类A对象(A* obj = new A()),而类中同时包含不同类型的数据成员时,实际会发生什么?创建该对象时堆上会分配多少内存?所谓“栈分配的数据成员”是否被排除在对象的堆分配内存之外?
示例代码:
class A{ public: int height; int * weight; A(){ height=0; weight= new int(100); } }; int main(){ A *obj = new A(); // 这个对象的内存分配情况是怎样的 return 0; }
我的假设:当创建堆分配对象时,“栈分配型”数据成员在栈上分配,不计入对象的堆内存;“堆分配型”数据成员在堆上分配,计入对象的堆内存。因此上述示例中,堆上仅需分配4字节,因为只有一个指针类型的数据成员。
回答
- 你的假设完全错误。用
new A()在堆上创建对象时,整个对象的所有非静态数据成员都会跟着对象一起分配在堆上,和成员的类型无关。 - 以你的示例来说,32位系统下,
int占4字节,int*指针也占4字节,所以堆上为obj指向的A对象分配的内存大小是8字节(实际可能因编译器内存对齐规则略有调整,但核心是两个成员都在堆上)。 - 构造函数里的
new int(100)是另一笔独立的堆分配:它会在堆上单独开辟4字节空间存储整数100,再把这个空间的地址赋值给weight指针——这笔内存和A对象本身的堆内存是完全分开的。 - 栈分配只针对**函数内的局部变量(未加static)**或函数调用栈帧,和对象的存储位置绑定:如果是
A obj;这种栈上创建对象的方式,那height和weight指针才会在栈上;但只要是用new创建的对象,所有成员都随对象一起放在堆上。
内容的提问来源于stack exchange,提问作者shubham kakade
相关产品推荐
相关产品推荐

