【问题标题】:EXC_BAD_ACCESS with lambda capture带有 lambda 捕获的 EXC_BAD_ACCESS
【发布时间】:2016-08-20 21:22:44
【问题描述】:

首先,如果这看起来很明显,请原谅 - 我对 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();

【问题讨论】:

    标签: c++ c++11 exception lambda


    【解决方案1】:

    lambda 通过引用捕获progDialog。这意味着如果声明 progDialog 的范围终止,则 progDialog 不再有效,从而使 lambda 具有悬空引用。显示的代码不足以得出权威的答案,但这似乎是最有可能的答案。

    并且不能肯定地说progDialog 应该在这里按值捕获。即使它被价值捕获,progDialog 得到deleted,kaboom!这里根本没有给出权威结论的信息。

    “刚接触 C++”的人会发现花更多时间研究基本原则(如范围规则、指针和引用)更有用,这些原则是语言高级特性(如 lambda 和 lambda 捕获)的基础.在开始处理所有这些 lambda 表达式之前,您必须了解所有这些是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2015-03-24
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多