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

标签 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;
    }
}

最佳答案

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

当你需要保存它们时,你应该使用 clone of QListWidgetItem创建一个拷贝供您使用。请记住,不止一个插槽可以获取 QList。

关于c++ - 在信号中发出指针列表 - 如何处理删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825420/

相关文章:

c++ - 检测意外的弱链接符号

c++ - 错误 - 无法访问用于在 Omnet 中创建新节点的显示字符串

c++ - std::size 和 std::empty 的特化与模板不匹配

c++ - 从 QObject 继承类中的 winsock 连接函数

python - Qt QFormLayout 标签向左对齐,值向右对齐

c++ - 如何获取 graphicsmagick 的头文件

c++ - vector 正在抛出 bad_alloc

c++ - 纯虚函数和抽象类

c++ - Qt 中 QMainWindow 上的深色透明层

python - Phonon:视频播放后如何清屏