为什么我的 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内部崩溃,无法自行调试。我的崩溃从何而来?非常感谢

有几个问题:

  1. 非捕获 lambda 可以转换为函数指针,但指向 lambda 的指针不能。去掉地址运算符。
  2. lambda 表示的函数类型是 void(*)(M*)pfvoid(*)(void*)。他们不兼容!使 lambda 采用 void* 或更改 fp 以采用 M* 参数。
  3. 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* 删除对象会给您带来麻烦。

  1. 将 f 的参数类型更改为 void f(M*)
  2. 不要写这样的代码,它会让你走到最后

这是适用于 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;
}