在新表达式中进行内存分配后是否对初始化程序进

时间:2018-04-04 08:23:53

标签: c++ exception new-operator dynamic-memory-allocation object-initialization

考虑代码

auto p = new T( U(std::move(v)) );

然后初始化程序为U(std::move(v))。我们假设T( U(std::move(v)) )没有投掷。如果在底层内存分配之后评估初始化程序,则代码是强异常安全的。否则,事实并非如此。如果抛出内存分配,v就已经被移动了。因此,我对内存分配和初始化程序评估之间的相对顺序感兴趣。它是定义的,未指定的,还是什么?

1 个答案:

答案 0 :(得分:8)

是的,在分配后评估初始化。引用C ++ 17(N4659)[expr.new] 8.3.4 / 19:

  

在评估 new-initializer 中的表达式之前,对分配函数的调用进行了排序。   在计算 new-expression 的值之前,对已分配对象的初始化进行排序。