4

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

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

这归结为通过引用捕获的lambdas是否有一个微不足道的析构函数(我猜)?

我知道这可能是邪恶的,但仍然必须这样做。

4

1 回答 1

4

它是特定于实现的。您可能有理由认为这是真的,但这就是标准所说的(N4140,[expr.prim.lambda]/3,强调我的):

一个实现可以定义不同于下面描述的闭包类型,只要这不会改变程序的可观察行为,而是通过更改:
— 闭包类型的大小和/或对齐方式,
闭包类型是否可简单复制( Clause 9),
——闭包类型是否是标准布局类(Clause 9),或者
——闭包类型是否是 POD 类(Clause 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");
于 2015-04-28T09:59:41.973 回答