变量在调用lambda之前被销毁
Variable getting destroyed before calling lambda
我正在尝试构建一个lambda,它用一些前/后操作包装一些输入函数。
- 如果我试图包装一个正则函数lambda,我的代码运行良好,并且可以正确地调用前/后操作
- 然而,当我试图将装饰lambda应用于它之前生成的函数时,我的程序在抱怨内部函数在某个时刻被释放后崩溃(valgrind证实了这一点)
让我困惑的是,崩溃取决于编译器:代码在Xcode 6 clang
(基于clang-3.6
)上运行得很好,但在使用clang++-3.6
和g++4.8.4
的linux上崩溃。
我制作了一个再现这种行为的小程序:
#include <iostream>
#include <string>
#include <functional>
using namespace std;
typedef function<void(void)> NestedFn;
int main()
{
// Create a cfunction
auto lambdaFactory = [&](string title, NestedFn nestedFunc)
{
// title is copied to the new lambda
return [&, title]() {
cerr << "------------ START -----------" << endl;
cerr << "Inside: " << title << endl;
nestedFunc();
cerr << "------------- END ------------" << endl;
};
}
auto l1 = lambdaFactory("1", []() { cerr << "tNest (1)" << endl; });
auto l2 = lambdaFactory("2", []() { cerr << "tNest (2)" << endl; });
l1(); // Works ok, displays, START, 1, END
l2(); // Same here
auto dobble = lambdaFactory("Dobble", l1);
dobble(); // Display START, Inside Dobble, START,
// then crashes when trying to execute nestedFunc(), ie l1()
}
我在可变范围管理中做错了什么?这个程序没有使用苹果的LLVM崩溃有什么原因吗?
编辑
为了记录,这是T.C.建议校正后的正确lambdaFactory
:
auto lambdaFactory = [&](string title, NestedFn nestedFunc)
{
return [&, title, nestedFunc]() {
cerr << "------------ START -----------" << endl;
cerr << "Inside: " << title << endl;
nestedFunc();
cerr << "------------- END ------------" << endl;
};
};
对lambdaFactory
的调用返回的lambda通过引用捕获nestedFunc
,但nestedFunc
是一个通过值传递的函数参数,因此一旦对lambdaFactory
的调用返回,它就会超出范围,从而导致悬空引用。
这个程序没有使用苹果的LLVM崩溃,有什么原因吗?
未定义的行为是未定义的。您还可能使用两种不同的标准库实现(Mac上的libc++/linux上的libstdc++),因此在布局等方面可能存在差异。
相关文章:
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 模拟成员函数调用 lambda
- 使用多个输入向量中值的笛卡尔乘积调用 lambda
- QT C++如何调用lambda one
- QTimer::singleShot 仅在间隔为 0 时调用 lambda
- 在结构中调用 lambda 函数
- 调用 lambda 的结构/类成员时程序崩溃并"bad_function_call"
- 如何调用lambda模板
- C++不能从映射调用 lambda 表达式
- C++函数调用 lambda obj,按值调用比按引用调用快
- 为什么 std::apply 可以调用 lambda 而不是等效的模板函数?
- 在类方法内调用lambda函数中的类方法
- variadic模板函数会以相反的顺序调用lambda参数
- 如何从另一个lambda函数调用lambda函数
- 当另一个调用 lambda 使用默认捕获时,lambda 的闭包可能会被破坏吗?
- 调用 lambda 时出现分段错误,从 C++11 中的高阶函数返回
- 在GDB中调用lambda函数
- 变量在调用lambda之前被销毁