[英]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,kaboom! 這里根本沒有給出權威性結論的信息。
那些“ C ++的新手”會發現,花更多的時間來研究諸如lambda和lambda捕獲之類的語言高級功能的基本原理(例如作用域規則,指針和引用)會更有用。 在開始處理所有這些lambda之前,您必須了解所有這些工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.