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

C++中用new创建的基本类型变量,分配在栈还是堆?

关于C++中new创建基本类型的内存分配问题

嘿,这个问题问得很到位,我来给你理清楚细节:

首先划重点:不管用new创建的是基本类型(比如int、float)还是自定义类对象,分配的内存都在堆上——new这个操作符的核心作用就是触发动态内存分配,而动态内存的专属区域就是堆。

拿你给出的代码例子来说:

void test() { 
    int *pi = new int(1); 
}

这里有两个关键的内存区域要区分:

  • 指针变量pi是函数test的局部变量,它存储在栈上。当test函数执行完毕,栈帧被销毁,pi这个变量本身就会被释放;
  • 而new int(1)返回的地址所指向的那块内存(也就是*pi对应的那个值为1的int),是实实在在的堆内存。如果不显式调用delete pi来释放这块内存,它会一直占用堆空间,直到整个程序结束才会被操作系统回收——这也是常见的内存泄漏场景之一。

再说说和Java基本类型包装类的对比:
两者有一点点表面相似,但本质逻辑完全不同:

  • Java里的Integer是引用类型,new Integer(1)会在堆上创建一个包装对象;而直接定义int a = 1时,a作为局部基本类型变量存在栈上。Java要求基本类型必须通过包装类才能以对象形式存在于堆中;
  • 但C++没有这个限制,基本类型可以直接通过new在堆上分配内存,不需要额外的包装类——new int(1)直接就在堆上开辟了存储int值的空间,逻辑上更直接。

最后补充个小细节:C++里除了new,malloc这类C风格的动态内存分配函数,同样会在堆上分配内存,不管是基本类型还是自定义类型,只要是动态分配的,都属于堆内存范畴。而局部定义的非动态变量(比如int a = 1;),不管是基本类型还是自定义类对象,都存在栈上。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:34