通过引用捕获的C ++ 11 lambdas可以轻易破坏

时间:2015-04-28 09:32:06

标签: c++ c++11 lambda longjmp

我想知道以下是否存在内存泄漏(由标准指定)

...
jmp_buf env;
if(setjmp(env) == 0) {
    auto lambda = [&] () {
        ... 
        longjmp(env, 1);
    };
    lambda();
}

归结为lambdas通过引用捕获是否有一个简单的析构函数(我猜)?

我知道这可能是邪恶的,但不得不这样做。

1 个答案:

答案 0 :(得分:4)

这是特定于实现的。你可以合理地期望它是真的,但这是标准所说的(N4140,[expr.prim.lambda] / 3,强调我的):

  

实现可以定义闭包类型与下面描述的不同,只要这不会改变可观察量   程序的行为,而不是通过改变:
    - 封盖类型的尺寸和/或对齐方式,
    - 封闭类型是否可以轻易复制(第9条),
    - 闭包类型是否为标准布局类(第9条)或
    - 闭包类型是否为POD类(第9条)。

根据[class] / 3

的定义
  

平易可复制的类是一个类:     - 没有非平凡的复制构造函数(12.8),
    - 没有非平凡的移动构造函数(12.8),
    - 没有非平凡的复制赋值操作符(13.5.3,12.8),
    - 没有非平凡的移动赋值运算符(13.5.3,12.8)和
    - 有一个简单的析构函数(12.4)。

因此,允许实现为lambda创建一个非平凡的析构函数。

但是,您可以通过以下方式检查您的特定实施是否使您的特定lambda易于破坏:

auto lambda = [&]{ /*...*/ };
static_assert(std::is_trivially_destructible<decltype(lambda)>::value, "Lambda isn't trivially destructible");