You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:14:56