gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:28:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com