#include <iostream>
#include <functional>
int global = 9;
std::function<void()> functor;
int main()
{
int* ptr = &global;
functor = [ptr]
{
functor = nullptr;
std::cout << *ptr << std::endl;
};
functor();
}
以下是lambda捕获的变量ptr
,在functor()
调用仿函数首先通过functor = nullptr
删除,然后访问ptr
。我认为ptr
已损坏,因为它是已删除仿函数的字段。所有编译器成功执行该程序而不会崩溃并打印&#34; 9&#34;但我仍然怀疑这不是未定义的行为。有人可以证实吗?
答案 0 :(得分:8)
确实未定义。
以下是您可以确认的方法:
#include <iostream>
#include <functional>
struct S
{
~S() {std::cout << "~S()\n";}
};
std::function<void()> functor;
int main()
{
functor = [s = S()]
{
functor = nullptr;
std::cout << "End of lambda\n";
};
functor();
}
上面的代码打印(在GCC和Clang上):
~S() ~S() ~S() End of lambda
3个被破坏的实例是:一个被原始lambda捕获,一个被存储在functor
中的副本捕获,另一个被临时std::function::operator=(F &&)
捕获,由于某种原因has to make。< / p>