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
相关产品推荐
相关产品推荐

