如何使用placementnew重新初始化字段
how to use placement new to reinitialize the field?
我的类包含字段:
private:
OrderUpdate curOrderUpdate;
我一遍又一遍地使用它,它经常需要重新初始化:
for (int i = 0; i < entries.size(); i++) {
auto entry = entries[i];
new (&curOrderUpdate) OrderUpdate();
curOrderUpdate.MDEntryID = entry.get_MDEntryID().value()[0];
...
我有几个问题:
- 我可以使用变量吗?还是必须将其更改为指针?将
OrderUpdate curOrderUpdate
更改为OrderUpdate* curOrderUpdate
- 赋值是强制性的吗?我应该写
curOrderUpdate = new (&curOrderUpdate) OrderUpdate();
还是只写new (&curOrderUpdate) OrderUpdate()
就足够了
要回答您的具体问题:
-
是的,您可以直接存储对象(而不是通过指针),所以
OrderUpdae curOrderUpdate
是可以的。 -
不,你不必(实际上你不应该)分配。原位调用构造函数是正确的:`new(&curOrderUpdate)OrderUpdate()
但是,为了确保代码的安全,必须在重新调用构造函数之前调用析构函数。所以你可以这样改变循环:
for (int i = 0; i < entries.size(); i++) {
auto entry = entries[i];
curOrderUpdate.~OrderUpdate();
new (&curOrderUpdate) OrderUpdate();
curOrderUpdate.MDEntryID = entry.get_MDEntryID().value()[0];
然而,这种低级代码最好保留给非常的特殊情况,如并集和类并集结构。特别是,正如@JamesKanze在评论中指出的那样,如果构造函数抛出(而析构函数并不是微不足道的),代码就会出现严重问题——然后你的对象会被析构函数两次。
如果您只是在OrderUpdate()
中添加一个reinitialise()
函数,它将在不调用析构函数和构造函数的情况下做正确的事情,那么这将是一个非常干净的设计。
在同一对象上重复调用构造函数是可疑的。正确的方法是
curOrderUpdate = OrderUpdate();
相关文章:
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 预 C++20 位字段零初始化
- 如何使用函数的输出初始化 const 数组结构字段?
- 无法初始化以 std::byte 作为成员类型的位字段
- 列出常量和数组结构字段的初始化
- 在这种情况下,如何从类型 "const char*" 初始化字段?
- uninit_member:非静态类成员字段 m_cJobState.bstatus 未在此构造函数中初始化,也不在其调
- 无法初始化初始值设定项列表之外的字段
- 如何使用迭代器初始化地图的键字段?
- 使用静态方法初始化 const 类字段的做法是好是坏
- 初始化映射的值,该映射是结构内的字段
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 必须初始化字段值
- C++:类和构造函数:使用初始化列表初始化字段
- 如何使用placementnew重新初始化字段
- 类中未初始化字段的值
- 直接初始化字段vs默认构造函数中的初始化列表
- c++ 11统一初始化:字段初始化不是常量
- 优化掉未使用的参数化字段