Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is initializer evaluated after memory allocation in new expression?

Consider the code

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

The initializer is then U(std::move(v)). Let's assume that T( U(std::move(v)) ) does not throw. If the initializer is evaluated after the underlying memory allocation, the code is then strong-exception-safe. Otherwise, it is not. Had memory allocation thrown, v would have already been moved. I'm therefore interested in the relative order between memory allocation and initializer evaluation. Is it defined, unspecified, or what?

like image 657
Lingxi Avatar asked Apr 04 '18 08:04

Lingxi


1 Answers

Yes, the initialisation is evaluated after the allocation. Quoting C++17 (N4659) [expr.new] 8.3.4/19:

The invocation of the allocation function is sequenced before the evaluations of expressions in the new-initializer. Initialization of the allocated object is sequenced before the value computation of the new-expression.

like image 121
Angew is no longer proud of SO Avatar answered Oct 05 '22 11:10

Angew is no longer proud of SO