【问题标题】:Dangling pointer to lambda in C++ [duplicate]C ++中指向lambda的悬空指针[重复]
【发布时间】:2017-01-06 09:07:58
【问题描述】:

我最近看到一些生产 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 超出范围并将被销毁,但因为它用于生产代码,我想知道是否还有更多。

【问题讨论】:

  • ptr 将超出范围,但不是函数。
  • @Edgar Rokyan,感谢您提供的链接回答了我的问题,我很高兴承认我的问题可能被视为重复。

标签: c++ c++11 lambda


【解决方案1】:

“代码是否会导致 foo_ptr 悬空”

。即使您将代码替换为:

ptr = new <something>

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

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

【讨论】:

    【解决方案2】:

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

    您使用的是纯函数指针,因此一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2016-09-19
      • 1970-01-01
      • 2013-08-07
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多