是定义的函数参数的内部执行顺序
Is internal order of execution in function parameters defined?
让我们假设我们有以下代码片段:
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 :不。一个潜在的执行顺序是:
- 左
new Data
- 右
new Data
- 左
unique_ptr
构造函数 - 右
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]
。不再有可能在g
或h
之前评估a
和b
,这是原始代码的潜在问题。
相关文章:
- QML按钮点击功能执行顺序
- C++ - scanf() 和 printf() 执行顺序不对
- 递归函数的执行顺序
- 运算符 new 的执行顺序和构造函数的参数
- 如何检查参数包是否具有执行顺序中的确切类型
- std::bind() 参数列表中函子的执行顺序(可能与函数参数的求值顺序无关)
- 了解递归函数的执行顺序
- OpenMP 4.5 任务依赖关系和执行顺序
- 通过调试来检查C 中单行表达式执行顺序的方法
- 遵循 C++ 中的构造函数执行顺序
- 联接线程如何影响主线程中的执行顺序?
- C COUT行为 /执行顺序
- 是定义的函数参数的内部执行顺序
- 强制执行执行顺序
- OpenGL计算着色器中线程的执行顺序
- 按执行顺序创建Pthread
- 逻辑操作员执行顺序
- 如何在使用 std::make_tuple 时避免构造函数的未定义执行顺序
- 提升::thread_specific_ptr/清理与退出执行顺序
- C++ 多线程:执行顺序