C++ Lambda函数,分段故障预防

C++ Lambda函数,分段故障预防,c++,lambda,segmentation-fault,C++,Lambda,Segmentation Fault,我有一个指向传递给lambda函数的对象的指针。由于lambda函数在初始方法调用后1秒被调用,因此对象有时不再有效,从而导致分段错误 在使用lambda函数之前,如何验证该项在lambda函数中仍然有效 这就是我使用lambda函数的方法的样子: void myTab::myMethod(QStandardItem *item) { QColor blue(0, 0, 128, 20); QBrush brush(blue); item->setBackgrou

我有一个指向传递给lambda函数的对象的指针。由于lambda函数在初始方法调用后1秒被调用,因此对象有时不再有效,从而导致分段错误

在使用lambda函数之前,如何验证该项在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
    });
}
void myTab::myMethod(QStandardItem*item)
{
QColor蓝(0,0,128,20);
Q刷子(蓝色);
项目->立根(刷);
//1000毫秒后恢复背景
QTimer::singleShot(1000,[item,this]()可变{
项目->背景(Qt::透明)//
在使用lambda函数之前,如何验证该项在lambda函数中仍然有效

最简单的方法是让
物品
成为一个
共享的\u ptr
,您的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);
    });
}

似乎没有任何建议对我有效。我尝试了std::shared_ptr、std::weak_ptr和QSharedPointer。似乎项目添加到的模型以某种方式删除了项目?!然而,我最终使用了QStack,我推送了堆栈上的所有项目指针,一旦恢复或删除,这些项目就会从堆栈中弹出。因为时间总是很短同样,这种方法对我来说也很有效,尽管没有很好的实现。

可变的
的意义是什么,为什么捕获了
这个
?可能是@Alex的重复-不要认为这是正确的dup-问题不是空的,而是指向一个空闲的内存不是他的问题如何检查指针是否是空的有效,即它是否不是空指针?Nvm,我误读了这个问题。更好的选择是lambda获得一个std::weak_ptr。然后当代码决定对象不再需要时,它的寿命不会超过要求。计时器可以在使用前检查它是否有效。@LokiAstari我喜欢它。
QStandardItem
是一个Qt对象ect可能是有问题的。例如,有可能
QStandardItem
已经拥有
QStandardItemModel
,这可能会阻止使用
std::shared\u ptr
。但是,我认为除了OP之外,没有人知道这些细节。@James对Qt一无所知。这只是对这类专业人士的一般回答问题-据我所知,可能有一种特定于Qt的方法来检查项目是否存在。@Barry我理解,这并不是对你的答案的批评。我只是认为,在可以说这对OP或任何处理类似问题的Qt用户有效之前,其他人可能需要了解更多信息。
QTimer::singleShot(1000, [weak_item = std::weak_ptr<QStandardItem>(item)]{
    if (auto item = weak_item.lock()) {
        item->setBackground(Qt::transparent);
    }
});