簡體   English   中英

EXC_BAD_ACCESS具有Lambda捕獲

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM