为什么我的 C++ 程序在将 lambda 转换为函数指针时崩溃
Why my C++ program crash when convert lambda to function pointer
我尝试将 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;
}
[/code]
好像是CRT内部崩溃,无法自行调试。我的崩溃从何而来?非常感谢
有几个问题:
- 非捕获 lambda 可以转换为函数指针,但指向 lambda 的指针不能。去掉地址运算符。
- lambda 表示的函数类型是
void(*)(M*)
。 pf
是 void(*)(void*)
。他们不兼容!使 lambda 采用 void*
或更改 fp
以采用 M*
参数。
- C-casts 默默地做错事。如果其他都正确,你不需要一个,隐式转换就足够了。
以下代码将起作用:
#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;
}
通过 void*
删除对象会给您带来麻烦。
- 将 f 的参数类型更改为
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;
}
我尝试将 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;
}
[/code]
好像是CRT内部崩溃,无法自行调试。我的崩溃从何而来?非常感谢
有几个问题:
- 非捕获 lambda 可以转换为函数指针,但指向 lambda 的指针不能。去掉地址运算符。
- lambda 表示的函数类型是
void(*)(M*)
。pf
是void(*)(void*)
。他们不兼容!使 lambda 采用void*
或更改fp
以采用M*
参数。 - C-casts 默默地做错事。如果其他都正确,你不需要一个,隐式转换就足够了。
以下代码将起作用:
#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;
}
通过 void*
删除对象会给您带来麻烦。
- 将 f 的参数类型更改为
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;
}