我有以下内存管理问题 (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;
}
}
最佳答案
在列表中使用 QSharedPointer
然后当列表未被拾取时,它们将在列表的最后一个拷贝被销毁时被删除。
当你需要保存它们时,你应该使用 clone
of QListWidgetItem
创建一个拷贝供您使用。请记住,不止一个插槽可以获取 QList。
关于c++ - 在信号中发出指针列表 - 如何处理删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825420/