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

placement new中存储重用与对象生命周期结束的先后顺序探讨

C++对象生命周期与placement new的存储重用问题

C++标准给出以下示例,说明指针在指向的对象生命周期结束后仅能有限使用。但这里存在一个疑问:使用placement new时,是原对象的存储先被重用,随后它的生命周期才结束吗?从概念上讲,原本B类型对象占用的存储被D2类型对象重用,这似乎会让[basic.life]/6条款无法适用于该示例。但标准的表述似乎存在漏洞,使得下述示例合法——这意味着存储重用必须发生在原对象生命周期结束之前。

[basic.life]/6
.....

void B::mutate() {
  new (this) D2;    // 重用存储——结束*this的生命周期
  f();              // 未定义行为
  ... = this;       // 合法,this指向有效内存
}

更新问题:多次存储重用后的指针合法性

如果this指向的存储被重用两次,将this指针转换为void*是否仍合法?从标准的技术层面分析,这似乎是不合法的。

void B::mutate() {
  new (this) D2;    // 重用存储——结束*this的生命周期
  new (this) D2;    // 重用存储——结束*this的生命周期
  f();              // 未定义行为
  ... = this;       // 非法?此时存储已被重用两次,[basic.life]/6完全不适用,意味着引用this是无效的
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:38:13