在new表达式中,初始化器是否在内存分配之后被评估?

7

考虑以下代码:

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

接下来的初始化程序是U(std::move(v))。假设T( U(std::move(v)) )不会抛出异常。如果在底层内存分配之后评估初始化程序,则代码是强异常安全的。否则,它就不是。如果内存分配抛出异常,则v已经被移动。因此,我对内存分配和初始化程序评估之间的相对顺序感兴趣。它是定义的、未指定的还是什么?


如果你对新表达式的异常安全性感兴趣,你可能会想知道(如果还不知道的话),有些新表达式(使用用户定义的分配函数)可能会导致内存泄漏:[expr.new]/21 - Oliv
显然,必须分配内存才能将某些内容移入其中(或初始化它)! - Phil1970
1个回答

8
是的,初始化在分配之后进行评估。引用C++17(N4659)[expr.new] 8.3.4/19:
“调用分配函数按顺序排列在新初始化程序中表达式的评估之前。 分配对象的初始化按顺序排列在新表达式的值计算之前。”

准确无误,兄弟! - Lingxi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接