C++17新特性:用[*this]告别悬垂指针,提升并发健壮性
1. 聊一下Lambda的变化
在C++17之前,当我们希望在类成员函数中定义的lambda访问该类的其他成员时,最直接的方式是使用 [this]
捕获。然而,这种看似便捷的方式却暗藏风险。[this]
捕获的是一个指向当前对象的指针,本质上是一种引用。在异步编程模型中,如果lambda的生命周期超过了其捕获的对象的生命周期,这个指针就会变成一个悬垂指针(dangling pointer)。随之而来的,是未定义行为、内存损坏和程序崩溃等一系列严重问题。
为了根除这个问题,C++17标准委员会引入了一个优雅而强大的解决方案:[*this]
值捕获。这一新特性允许lambda捕获当前对象 *this
的一个副本,从而彻底解除了lambda与原始对象生命周期之间的耦合,为编写更健壮、更安全的并发代码铺平了道路。本文将深入探讨[*this]
的原理、应用场景及其潜在问题,帮助您在实践中充分利用这一现代C++的重要特性。
2. C++17之前:[this]
引用捕获的原理与局限
原理
在C++11/14中,当我们在lambda捕获列表中使用 [this]
时,我们实际上是在告诉编译器:“请为我捕获当前对象的this
指针”。lambda闭包中会存储这个this
指针的一个副本。在lambda函数体