Lambda函数,分段故障防止

use*_*407 2 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
    });
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 8

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

最简单的办法是有itemshared_ptr<QStandardItem>你的拉姆达只是获取的副本.这可以保证物品的使用寿命足够长:

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);
    });
}
Run Code Online (Sandbox Code Playgroud)

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


潜在更好的洛基建议将一个存储weak_ptritem.如果item在我们将其设置为透明之前已经死了,那很好 - 我们只是不将其设置为透明.如果我们实际上不需要延长其生命周期,那就不要:

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