跳到主要内容

C++17特性

this指针捕获(lambda)

在lambda表达式中,采用[this]方式捕获的this指针是值传递捕获的,但在一些情况下,会出现访问已经被释放了的空间的行为;比如如下代码

#include <functional>
#include <iostream>
#include <memory>
using namespace std;

struct Foo
{
std::unique_ptr<int> p;

std::function<void()> f()
{
p.reset(new int(10));
return [&]
{
cout << 5 << endl;
cout << *p << endl; // 实际上是这一步报错的
// 这里对*p的访问可以解析为 *(this->p),但实际上this指针已经被销毁了
// 注意,这里采用了智能指针,不存在内存泄漏,p指针指向的空间也被销毁了
// 但我们的报错其实是对this指针解引用的时候就抛出了
cout << 6 << endl;
};
}
};

int main()
{
auto foo = new Foo();
cout << 1 << endl;
auto f = foo->f(); // 获取了一个类内成员函数
cout << 2 << endl;
delete foo; // 销毁这个对象
cout << 3 << endl;
// 尝试在销毁后继续使用这个对象,我们是通过lambda中=捕获的this指针来访问对象的
f(); // 这里直接报错了 Segmentation fault (core dumped)
cout << 4 << endl;

return 0;
}

std::any, std::optional, std::variant