gpt4 book ai didi

c++ - Lambda函数,段错误预防

转载 作者:太空狗 更新时间:2023-10-29 23:49:45 28 4
gpt4 key购买 nike

我有一个指向我传递给 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
});
}

最佳答案

How can I verify that the item is still valid within the lambda function before using it?

最简单的方法是使用 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_ptritem .如果item在我们将它设置为透明之前就已经死了,这很好 - 我们只是不将它设置为透明。如果我们实际上不需要延长它的生命周期,那就不要:

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

关于c++ - Lambda函数,段错误预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37189541/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com