将lambda转换为函数指针时为什么我的C ++程序崩溃

时间:2016-02-22 10:57:26

标签: c++ function pointers lambda crash

我尝试将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内部,无法自行调试。我的崩溃来自哪里?非常感谢

2 个答案:

答案 0 :(得分:3)

有几个问题:

  1. 非捕获lambdas可以转换为函数指针,指向lambdas的指针不能。摆脱运营商的地址。
  2. lambda表示的函数类型是void(*)(M*)pfvoid(*)(void*)。它们不兼容!要么使lambda采用void*,要么更改fp以获取M*参数。
  3. C-casts默默地做错了。如果其他一切都正确,你就不需要一个,隐式转换就足够了。
  4. 以下代码可以使用:

    #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*删除对象会让您遇到麻烦。

  1. 将参数类型更改为f为void f(M*)
  2. 不要写这样的代码,它会让你最终
  3. 这里的代码适用于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;
    }