是定义的函数参数的内部执行顺序

Is internal order of execution in function parameters defined?

本文关键字:执行 顺序 内部 函数 定义 参数      更新时间:2023-10-16

让我们假设我们有以下代码片段:

void foo(std::unique_ptr<Data> p1, std::unique_ptr<Data> p2){
    bar(p1);
    bar(p2);
}
int main(){
    foo( std::unique_ptr<Data>{new Data}, std::unique_ptr<Data>{new Data});
}

问题是:运行此代码时,内存将始终释放(无论发生什么情况)?

Standard说,我们不能依靠语句的顺序是函数参数,但是内部功能调用/内存分配等呢?在这里甚至重要吗?

运行此代码时,内存将始终释放(无论发生什么情况)?

C 17 :不。一个潜在的执行顺序是:

  1. new Data
  2. new Data
  3. unique_ptr构造函数
  4. unique_ptr构造函数

如果(1)投掷,我们还可以。如果(2)投掷,我们实际上还没有运行unique_ptr构造函数,因此我们没有任何清理机制可以从(1)中释放内存。那会泄漏。仅在(1)和(2)投掷的情况下,我们很好。

这就是为什么标准引入std::make_unique

foo( std::make_unique<Data>(), std::make_unique<Data>() );

没有这个问题 - new S现在将内部分组到unique_ptr构造函数中。因此,如果一个人成功,它已经将其包裹在其RAII警卫中。


C 17 :是的。虽然函数参数的评估顺序仍然未指定,但有一个新规则,即无法交错。也就是说,给定f(g(a), h(b)),评估的潜在顺序为:[f, g, a, h, b][f, h, b, g, a]。不再有可能在gh之前评估ab,这是原始代码的潜在问题。