我有以下内存管理问题(qt5 / c ++)。我正在制作QListWidgetItems
:
QList<QListWidgetItem*> items;
foreach(MyItem myItem in myItems)
{
QListWidgetItem * item = new QListWidgetItem(myItem.text);
items.append(item);
}
emit itemsReadyForList(items);
当在某处拾取发出的信号时,这些项目可以添加到QListWidget
,并在其析构函数或clear()
被调用后删除。
但是,当未拾取此信号时,如何防止生成的列表产生内存泄漏?
QListWidget::addItem()
需要一个堆对象,所以我不能基于QListWidgetItems堆栈列表并使用addItem(*item)
添加它们,因为一旦处理完信号并且列表没有出现范围,该项目被删除。
我考虑过使用QSharedPointer
,但是当将原始指针传递给任何可以删除它的代码时,都不应该使用QListWidget
。
所以我必须像这样创建自己的指针类(伪代码):
class MyPointer
{
bool dontDelete = false;
QListWidgetItem * item;
QListWidgetItem * getPointerAndYieldControl()
{
dontDelete = true;
return item;
}
~MyPointer
{
if (!dontDelete)
delete item;
}
}
答案 0 :(得分:2)
在列表中使用QSharedPointer
,然后当列表未被提取时,当列表的最后一个副本被销毁时,它们将被删除。
当您需要保存它们时,您应该使用clone
of QListWidgetItem
创建一个副本供您使用。请记住,多个插槽可以接收QList。
答案 1 :(得分:1)
您可以让items
成为发出signal
的类的成员,然后在此类的析构函数中使用delete
取消分配。如果已删除的对象为delete
或NULL
,则对nullptr
进行调用不是问题。因此,如果signal
中没有slot
,则会删除这些项目。但是,如果信号被插入广告位,并且父NULL
被销毁,则必须确保分配nullptr
或QListWidget
。
修改强>
至于你的评论,我想你的设计必须进行修改。您可以仅在需要时创建项目,并在使用后销毁,或者您应该始终在父类中保留它们,在需要时使用并在父项被销毁时销毁。
对我来说,更好的设计是将用作列表中项目的文本的字符串作为成员变量。然后在signal
中传递这些字符串。在slot
中,将创建项目并将其添加到QListWidget
,并使用窗口小部件销毁项目。如果您再次需要它们,请再次生成它们。