首页 > 解决方案 > 放置新以规避赋值构造函数

问题描述

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 吗?

标签: c++new-operatorassignment-operatorcopy-assignment

解决方案


你不应该这样做,尽管在这种情况下它在技术上是可行的。

通过规避复制分配,您不会让对象有机会对旧数据执行任何所需的清理(例如释放内存资源)。在此示例中,您将在a结束的生命周期之前调用新的放置运算符。

以下将起作用,因为它不会违反a的生命周期:

a.~A(); // manually destruct a, end it's lifetime
new(&a) A(69); // construct a new instance and start a new lifetime

推荐阅读