在C ++中悬空指向lambda的指针

时间:2017-01-06 09:07:58

标签: c++ c++11 lambda

我最近看到一些生产C ++代码将lambda分配给函数指针并允许lambda超出范围。我想知道这是否会导致指向lambda的悬空指针。我的代码复制如下。我想知道代码是否会导致foo_ptr悬挂:

#include <iostream>

using foo_ptr = void(*)();

int main()
{
    foo_ptr ptr{ nullptr };

    {
        ptr = []()
        {
            std::cout << "foo" << std::endl;
        };
    }

    // Question: is ptr dangling?
    ptr();

    std::cout << "Done...";
    std::getchar();

    return EXIT_SUCCESS;
}

我认为答案是是因为lambda超出范围并将被销毁,但因为这在生产代码中使用,我想知道是否还有更多内容。

2 个答案:

答案 0 :(得分:2)

  

&#34;代码是否会导致foo_ptr悬挂&#34;

即可。即使用以下代码替换代码,也没有悬空发生:

ptr = new <something>

当指针被删除(释放内存)并且未分配给nullptr(或0)时,会创建悬空指针。在这种情况下,这两种情况都没有发生。

此外,lambda的地址不存储在freestore或stack中,因此无需担心。代码是安全的。

答案 1 :(得分:0)

在std C ++中,所有代码始终链接并存在,因此指向代码的指针永远不会超出范围。然而,非syatic数据可能超出范围,因此可能需要小心以确保指针保持有效。

您正在使用纯函数指针,因此一切都可以正常工作。