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

C++中new运算符后接地址的作用及两段代码是否等价的问题

代码功能说明与等价性判断

第一段代码功能

你给出的第一段代码使用了C++的**定位new(placement new)**语法,执行逻辑如下:

  • 首先在栈上声明了一个int类型变量a,以及int类型指针b
  • 第三行的new (&a) int(5)不会向堆申请新内存,而是直接在传入的地址&a(也就是变量a的内存地址)上构造一个int对象,用数值5完成初始化,最后将该地址返回赋值给b

执行完这段代码后,a的值会被改写为5,指针b和&a的地址完全相同,指向栈上的同一块内存,不需要也不能对b执行delete操作,否则会因为释放栈内存触发运行错误。

两段代码不等价,核心区别如下

第二段代码是普通的堆内存申请逻辑,和第一段的差异非常明显:

  • 内存指向不同:第一段的b指向栈上变量a的内存,第二段的b指向堆上新申请的独立内存,和a的内存地址完全无关
  • 操作逻辑不同:第一段是直接在a的内存空间上构造对象赋值,修改*b等于直接修改a;第二段是先给a赋值5,再把5拷贝到新的堆内存中,后续修改a不会影响*b,修改*b也不会影响a
  • 内存管理要求不同:第一段的b指向栈内存,函数退出时自动回收,不需要手动释放;第二段的b指向堆内存,必须手动执行delete b释放,否则会出现内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:54:06