Lambda功能,防止分段故障
Lambda function, segmentation fault prevent
我有一个指向对象的指针,我将其传递给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
});
}
在使用lambda函数之前,如何验证该项在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所建议的,可能更好的是将weak_ptr
存储到item
。如果item
在我们可以将其设置为透明之前就已经死了,那没关系——我们只是不将它设置为透明。如果我们实际上不需要延长它的寿命,那就不要:
QTimer::singleShot(1000, [weak_item = std::weak_ptr<QStandardItem>(item)]{
if (auto item = weak_item.lock()) {
item->setBackground(Qt::transparent);
}
});
似乎没有任何建议对我有效。我尝试了std::shared_ptr、std::weak_ptr和QSharedPointer。似乎添加该项目的模型以某种方式删除了该项目?!然而,我最终使用了QStack,在那里我推送了堆栈上的所有项目指针,一旦恢复或删除,项目就会从堆栈中弹出。由于时间总是一样的,所以这种方法对我来说效果很好,尽管不是很好地实现。
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数
- C++分段故障BST