EXC_BAD_ACCESS with lambda capture
EXC_BAD_ACCESS with lambda capture
首先,如果这看起来很明显,请原谅我-我对c++有点陌生。我一直在调查这件事,但我没有发现任何特别有用的东西。
当试图访问lambda中捕获的变量时,我的应用程序崩溃了,我不知道为什么。我不认为这个对象已经被删除了,因为当把一个断点放在它崩溃的地方并使用CLion的调试器时,CLion显示这个对象存在。
一个代码示例可能会帮助我解释这一点:
//Create the progress dialog
QProgressDialog *progDialog = new QProgressDialog(tr("Opening Project…nExtracted: 0 (0.0%)nWaiting…"), nullptr, 0, 0, this);
// ... Some code here
//Declare a function to be passed as a callback
std::function<void (int minValue, int maxValue)> *progRangeChangedCallback = nullptr;
// ... More code here
//Create the lambda
//I capture progDialog (The progress dialog)
auto progRangeChangedCallbackLambda = [&progDialog](int newMin, int newMax) {
//Putting a breakpoint here reveals that progDialog exists
//CLion even autocompletes the below functions
//when trying to evaluate an expresion
progDialog->setMinimum(newMin); //EXC_BAD_ACCESS: Crashes happen here!
progDialog->setMaximum(newMax);
};
// ... Even more code here
//Put the lambda in a std::function
progRangeChangedCallback = new std::function<void (int minValue, int maxValue)>(progRangeChangedCallbackLambda);
// ... More code
//Pass the std::function object as a callback to a new thread
//This extends QThread
OpenProjectThread *thread = new OpenProjectThread(filePath, this, progChangedCallback, progRangeChangedCallback, onSuccessCallback, onErrorCallback);
thread->start();
lambda通过引用捕获progDialog
。这意味着,如果声明progDialog
的作用域终止,则progDialog
不再有效,使lambda具有悬空引用。显示的代码不足以得出一个权威的答案,但这似乎是最可能的答案。
在这里不能肯定地说progDialog
应该按值捕获。即使它是按值捕获的,progDialog
得到delete
d,爆炸!这里没有提供任何信息来得出一个权威的结论。
对c++有点陌生的人会发现,花更多的时间学习基本原理会更有用,比如作用域规则、指针和引用,这些基本原理支撑着语言的高级特性,比如lambda和lambda捕获。在开始摆弄这些lambdas之前,您必须了解所有这些是如何工作的。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- std::move a const std::vector in a lambda capture
- "lambda capture"正常功能?
- capture是如何将基类中的这个派生为lambda函数的
- C++:如何从 lambda 中"un-capture"不可复制的内容(例如 unique_ptr)?
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- Lambda Capture by Value强制所有作用域对象为常量
- c++ lambda, capture, Smart Ptrs和Stack:为什么这样做?
- C++ lambda & std::function capture by value memory management?
- 为什么lambda init-capture对unique_ptr不起作用?
- 变量不能在没有指定capture-default的lambda中隐式捕获
- EXC_BAD_ACCESS with lambda capture