Lambda函数,分段故障防止

时间:2016-05-12 14:12:25

标签: c++ lambda segmentation-fault

我有一个指向对象的指针,我将其传递给lambda函数。因为lambda函数在初始方法调用后被调用1秒,所以该对象有时无效,导致分段错误。

如何在使用lambda函数之前验证该项是否仍然有效?

这是我使用lambda函数的方法的样子:

void myTab::myMethod(QStandardItem *item)
{
    QColor blue(0, 0, 128, 20); 
    QBrush brush(blue);
    item->setBackground(brush);

    //Restore background after 1000ms
    QTimer::singleShot(1000, [item, this]() mutable {
        item->setBackground(Qt::transparent);     //<-need some advice here
    });
}

2 个答案:

答案 0 :(得分:8)

  

如何在使用lambda函数之前验证该项是否仍然有效?

最简单的方法是让itemshared_ptr<QStandardItem>,而你的lambda只是得到一份副本。这可以保证物品的使用寿命足够长:

void myTab::myMethod(std::shared_ptr<QStandardItem> item)
{
    QColor blue(0, 0, 128, 20); 
    QBrush brush(blue);
    item->setBackground(brush);

    //Restore background after 1000ms
    QTimer::singleShot(1000, [item]{
        item->setBackground(Qt::transparent);
    });
}

否则,你无法从指针中判断出它是否指向一个仍然有效的对象。或者像对象这样的其他怪异被删除了,并且新的一个恰好被分配在同一个内存中,现在你有一个错误,其中一些随机项偶尔会变得透明。最好回避所有这些问题。

Loki suggests可能会将weak_ptr存储到item。如果item在我们将其设置为透明之前已经死了,那很好 - 我们只是不将其设置为透明。如果我们实际上不需要延长其生命周期,那就不要:

QTimer::singleShot(1000, [weak_item = std::weak_ptr<QStandardItem>(item)]{
    if (auto item = weak_item.lock()) {
        item->setBackground(Qt::transparent);
    }
});

答案 1 :(得分:0)

似乎没有任何建议对我有用。我试过std :: shared_ptr,std :: weak_ptr和QSharedPointer。看起来像模型项目被添加到某种程度上删除项目?!但是,我最终使用了一个QStack,我在其中推送了堆栈上的所有项目指针,一旦恢复或删除了项目从堆栈中解脱出来。由于时间总是相同的,这种方法对我来说是完美的,但是实现得不是很好。