【发布时间】:2014-05-23 09:20:38
【问题描述】:
我有以下内存管理问题 (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;
}
}
【问题讨论】: