C ++:在自己内部摧毁lambda

时间:2018-03-05 16:34:20

标签: c++ c++11 lambda

#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;但我仍然怀疑这不是未定义的行为。有人可以证实吗?

1 个答案:

答案 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>