发出信号中的指针列表 - 如何处理删除

时间:2014-05-23 09:20:38

标签: c++ qt

我有以下内存管理问题(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;
    }
}

2 个答案:

答案 0 :(得分:2)

在列表中使用QSharedPointer,然后当列表未被提取时,当列表的最后一个副本被销毁时,它们将被删除。

当您需要保存它们时,您应该使用clone of QListWidgetItem创建一个副本供您使用。请记住,多个插槽可以接收QList。

答案 1 :(得分:1)

您可以让items成为发出signal的类的成员,然后在此类的析构函数中使用delete取消分配。如果已删除的对象为deleteNULL,则对nullptr进行调用不是问题。因此,如果signal中没有slot,则会删除这些项目。但是,如果信号被插入广告位,并且父NULL被销毁,则必须确保分配nullptrQListWidget

修改

至于你的评论,我想你的设计必须进行修改。您可以仅在需要时创建项目,并在使用后销毁,或者您应该始终在父类中保留它们,在需要时使用并在父项被销毁时销毁。

对我来说,更好的设计是将用作列表中项目的文本的字符串作为成员变量。然后在signal中传递这些字符串。在slot中,将创建项目并将其添加到QListWidget,并使用窗口小部件销毁项目。如果您再次需要它们,请再次生成它们。