std::launder用于告知编译器指针所指内存已承载新构造对象,避免优化导致未定义行为;它不分配内存、不构造对象,仅提供生命周期语义提示,解决placement new重用内存后旧指针访问失效问题。

std::launder 是 C++17 引入的一个工具函数,用于在特定场景下“告知”编译器:某个指针所指向的内存位置,**现在(或已经)承载着一个新构造的对象**,且该对象与指针原始来源无关。它不分配内存、不构造对象、不调用任何函数,只是向编译器提供一个关键的生命周期语义提示——避免因优化导致未定义行为。
解决“指针重用内存”时的优化陷阱
当一块内存被显式析构后又原地 new 构造新对象(placement new),或通过 std::memcpy/std::bit_cast 等方式“覆盖”了原有对象,此时旧指针(如指向原对象的指针)**不能安全用于访问新对象**——编译器可能仍按旧对象类型做别名分析或寄存器缓存,导致读取错误值甚至崩溃。
std::launder 就是为这种场景而生:
- 它接受一个指向某地址的指针(T*),返回一个“打过招呼”的新指针(同样 T*)
典型必须用 launder 的例子
下面这段代码在 C++17 前是未定义行为,C++17 后需用 launder 修复:
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~