c++ - 放置新以规避赋值构造函数
问题描述
placement new
它是用于规避复制分配的可行解决方案吗?
我有一个包含const
成员的成员对象。对象本身是在运行时创建的,但它的成员是常量。
我想知道是否可以placement new
在运行时使用来规避复制分配?
#include <new>
#include <iostream>
struct A {
const int a;
A() : a(0) {};
A(int a) : a(a){}
};
struct B {
A a;
void createA() {
new(&a) A(69);
}
void useA() {
std::cout << a.a << std::endl;
}
};
int main(void) {
B b;
b.createA();
b.useA();
return 0;
}
它编译并运行,但它调用 UB 吗?
解决方案
你不应该这样做,尽管在这种情况下它在技术上是可行的。
通过规避复制分配,您不会让对象有机会对旧数据执行任何所需的清理(例如释放内存资源)。在此示例中,您将在a
结束的生命周期之前调用新的放置运算符。
以下将起作用,因为它不会违反a
的生命周期:
a.~A(); // manually destruct a, end it's lifetime
new(&a) A(69); // construct a new instance and start a new lifetime
推荐阅读
- java - 使用现有服务器创建 Micronaut java httpclient
- python - 如何将 pandas 安装到 Visual Studio 代码中?
- html - HTML:带有基于 if/else 的动态下拉列表的表单?(新手问题)
- python - 蟒蛇,硒。如何按样式或 xpath 编号查找元素?
- java - Java 系统输出打印慢
- java - 如何正确使用共享存储中的存储访问框架 (SAF) 和 URI 编辑文本文件?
- php - MySQL插入失败,没有错误,执行中的绑定值,PHP
- postgresql - java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 jsonb 类型数据得到 JpaSystemException
- python - 如何在 Queryset 类中通过聚合获取对象计数
- frameworks - 我在向导航栏应用填充时遇到问题(扩展时)