我最近看到一些生产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超出范围并将被销毁,但因为这在生产代码中使用,我想知道是否还有更多内容。
答案 0 :(得分:2)
&#34;代码是否会导致foo_ptr悬挂&#34;
否即可。即使用以下代码替换代码,也没有悬空发生:
ptr = new <something>
当指针被删除(释放内存)并且未分配给nullptr
(或0)时,会创建悬空指针。在这种情况下,这两种情况都没有发生。
此外,lambda的地址不存储在freestore或stack中,因此无需担心。代码是安全的。
答案 1 :(得分:0)
在std C ++中,所有代码始终链接并存在,因此指向代码的指针永远不会超出范围。然而,非syatic数据可能超出范围,因此可能需要小心以确保指针保持有效。
您正在使用纯函数指针,因此一切都可以正常工作。