我尝试将lambda函数转换为函数指针,编译OK,但运行时崩溃(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内部,无法自行调试。我的崩溃来自哪里?非常感谢
答案 0 :(得分:3)
有几个问题:
void(*)(M*)
。 pf
是void(*)(void*)
。它们不兼容!要么使lambda采用void*
,要么更改fp
以获取M*
参数。以下代码可以使用:
#include <cstdio>
struct M
{
~M(){ printf("dtor\n"); }
};
typedef void(*pf)(M*);
int main(void)
{
M *p = new M;
auto f = [](M*p){delete p; };
pf p1 = f;
(*p1)(p);
return 0;
}
答案 1 :(得分:0)
通过void*
删除对象会让您遇到麻烦。
void f(M*)
这里的代码适用于gcc 4.8
#include <cstdio>
class M; //forward dec
typedef void(*pf)(M*);
struct M
{
~M(){ printf("dtor\n"); }
};
int main(void)
{
M *p = new M;
auto f = [](M*p){delete p; };
pf p1 = f;
(*p1)(p);
return 0;
}