使用lambda作为插槽时的Qt对象所有权

时间:2015-06-10 06:31:39

标签: c++ qt memory-management

我最近加入了一个新项目,其中充满了成语,如:

void foo()
{
    Widget* temp = new Widget; 
    connect(temp, &Widget::signalTriggerred,[this, temp ]()
    {
         do cool staff...
    }
}

你可以看到没有删除任何东西,我甚至害怕用户类" Widget"继承了QObject,这仍然是一个漏洞。在上述情况下,QT是否做了一些想要防止韭菜的事情?

我打算做什么:

void foo 
{
     std::shared_ptr<Widget > temp( new Widget () );
     connect(temp.get(), &Widget::signalTriggerred,[this, temp] ()
     {
          do even cooler things...
     }
}

我的apporach有问题吗? (例如,我不想使用.get(),但编译器错误迫使我使用它)。

编辑:因为在我的情况下没有父母,所以它是不同的。重复的问题寻求父母子女案件的答案。在这种情况下,我已经知道不会有韭菜。在我的问题中,我问的是创建一个基于QObject的本地对象。并连接它。

1 个答案:

答案 0 :(得分:0)

不太确定你想从问题中得到什么,但如果你需要删除小部件并且它是从QObject派生的,你可以在lambda表达式中删除它,假设它不会去在此范围之后使用:

void foo()
{
    Widget* temp = new Widget; 
    connect(temp, &Widget::signalTriggerred,[this, temp ]()
    {
         temp->deleteLater();
    }
}