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

