From ca227f940fcb8ff996732d31726d9febdd752dca 2017-07-05 12:15:08 From: Alexandre Leroux Date: 2017-07-05 12:15:08 Subject: [PATCH] Uses weak pointers in lambda functions to prevent a shared_ptr from ever being deleted (because a reference would always be kept in the lambda) --- diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index fe92759..53b92cf 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -136,13 +136,14 @@ void VariableController::createVariable(const QString &name, // store the provider impl->m_VariableToProviderMap[newVariable] = provider; - auto addDateTimeAcquired - = [this, newVariable](auto dataSeriesAcquired, auto dateTimeToPutInCache) { - - impl->m_VariableCacheController->addDateTime(newVariable, dateTimeToPutInCache); - newVariable->setDataSeries(dataSeriesAcquired); - - }; + auto addDateTimeAcquired = [ this, varW = std::weak_ptr{newVariable} ]( + auto dataSeriesAcquired, auto dateTimeToPutInCache) + { + if (auto variable = varW.lock()) { + impl->m_VariableCacheController->addDateTime(variable, dateTimeToPutInCache); + variable->setDataSeries(dataSeriesAcquired); + } + }; connect(provider.get(), &IDataProvider::dataProvided, addDateTimeAcquired); this->onRequestDataLoading(newVariable, dateTime); diff --git a/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp b/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp index ad85543..e7190da 100644 --- a/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp +++ b/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp @@ -121,9 +121,12 @@ void GenerateVariableMenuOperation::visitLeave(VisualizationTabWidget *tabWidget { if (tabWidget) { // 'Plot' menu - impl->visitNodeLeavePlot( - *tabWidget, QObject::tr("Open in a new zone"), - [ var = impl->m_Variable, tabWidget ]() { tabWidget->createZone(var); }); + impl->visitNodeLeavePlot(*tabWidget, QObject::tr("Open in a new zone"), + [ varW = std::weak_ptr{impl->m_Variable}, tabWidget ]() { + if (auto var = varW.lock()) { + tabWidget->createZone(var); + } + }); // 'Unplot' menu impl->visitNodeLeaveUnplot(); @@ -152,7 +155,11 @@ void GenerateVariableMenuOperation::visitLeave(VisualizationZoneWidget *zoneWidg // 'Plot' menu impl->visitNodeLeavePlot( *zoneWidget, QObject::tr("Open in a new graph"), - [ var = impl->m_Variable, zoneWidget ]() { zoneWidget->createGraph(var); }); + [ varW = std::weak_ptr{impl->m_Variable}, zoneWidget ]() { + if (auto var = varW.lock()) { + zoneWidget->createGraph(var); + } + }); // 'Unplot' menu impl->visitNodeLeaveUnplot(); @@ -167,14 +174,20 @@ void GenerateVariableMenuOperation::visit(VisualizationGraphWidget *graphWidget) { if (graphWidget) { // 'Plot' menu - impl->visitLeafPlot( - *graphWidget, QObject::tr("Open in %1").arg(graphWidget->name()), - [ var = impl->m_Variable, graphWidget ]() { graphWidget->addVariableUsingGraph(var); }); + impl->visitLeafPlot(*graphWidget, QObject::tr("Open in %1").arg(graphWidget->name()), + [ varW = std::weak_ptr{impl->m_Variable}, graphWidget ]() { + if (auto var = varW.lock()) { + graphWidget->addVariableUsingGraph(var); + } + }); // 'Unplot' menu - impl->visitLeafUnplot( - *graphWidget, QObject::tr("Remove from %1").arg(graphWidget->name()), - [ var = impl->m_Variable, graphWidget ]() { graphWidget->removeVariable(var); }); + impl->visitLeafUnplot(*graphWidget, QObject::tr("Remove from %1").arg(graphWidget->name()), + [ varW = std::weak_ptr{impl->m_Variable}, graphWidget ]() { + if (auto var = varW.lock()) { + graphWidget->removeVariable(var); + } + }); } else { qCCritical(LOG_GenerateVariableMenuOperation(),