【发布时间】:2016-02-22 10:57:25
【问题描述】:
我尝试将 lambda 函数转换为函数指针,编译正常,但运行时崩溃(VC2013)。这个 lambda 函数只是删除一个指针,像这样:
typedef void(*pf)(void*);
struct M
{
~M(){ printf("dtor\n"); }
};
int main(void)
{
M *p = new M;
auto f = [](M*p){delete p; };
pf p1 = (pf)&f;
(*p1)(p);
return 0;
}
[/代码]
崩溃似乎发生在 CRT 内部,无法自行调试。我的崩溃是从哪里来的?非常感谢
【问题讨论】:
-
(pf)&f;是危险的,为了确保可以安全地执行转换,请使用static_cast。使用它你会得到错误,基本上说f的类型不是指向函数的指针。 => 未定义的行为 -
除非您知道自己在做什么,否则不要强制转换:警告:ISO C++ 禁止在指向函数的指针和指向对象的指针之间强制转换 [-Wpedantic]
-
为什么要使用函数指针? C++11 提供了许多其他方式来存储指向可调用对象的指针
-
“我试图将 lambda 函数转换为函数指针”:不,您尝试将 pointer 转换为 lambda 函数为函数指针。 (当编译器说你不能时,你没有听,而是插入了一个演员表。)
标签: c++ function pointers lambda crash