我有一个指向对象的指针,我将其传递给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
});
}
答案 0 :(得分:8)
如何在使用lambda函数之前验证该项是否仍然有效?
最简单的方法是让item
为shared_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,我在其中推送了堆栈上的所有项目指针,一旦恢复或删除了项目从堆栈中解脱出来。由于时间总是相同的,这种方法对我来说是完美的,但是实现得不是很好。