gpt4 book ai didi

c++ - C++/Qt - 内存分配如何工作?

转载 作者:IT王子 更新时间:2023-10-28 23:34:08 25 4
gpt4 key购买 nike

我最近开始为自己研究 Qt 并有以下问题:

假设我有一些 QTreeWidget* 小部件。有时我想向其中添加一些项目,这是通过以下调用完成的:

QList<QTreeWidgetItem*> items;

// Prepare the items
QTreeWidgetItem* item1 = new QTreeWidgetItem(...);
QTreeWidgetItem* item2 = new QTreeWidgetItem(...);
items.append(item1);
items.append(item2);

widget->addTopLevelItems(items);

到目前为止看起来还不错,但我实际上不明白谁应该控制对象的生命周期。我应该用一个例子来解释这个:

假设,另一个函数调用 widget->clear(); 我不知道在这个调用下会发生什么,但我确实认为分配给 item1item2 不会在这里处理,因为它们的所有权实际上并没有被转移。 而且,砰,我们有内存泄漏。

问题如下 - Qt 对这种情况有帮助吗? 我可以使用 boost::shared_ptr 或任何其他智能指针并写类似

shared_ptr<QTreeWidgetItem> ptr(new QTreeWidgetItem(...));
items.append(ptr.get());

但我不知道 Qt 本身是否会尝试对我的指针进行显式 delete 调用(这将是灾难性的,因为我将它们声明为 shared_ptr-managed )。

你会如何解决这个问题? 也许一切都是显而易见的,我错过了一些非常简单的事情?

最佳答案

快速浏览一下 qtreewidget.cpp 会发现:

void QTreeWidget::clear()
{
Q_D(QTreeWidget);
selectionModel()->clear();
d->treeModel()->clear();
}

void QTreeModel::clear()
{
SkipSorting skipSorting(this);
for (int i = 0; i < rootItem->childCount(); ++i) {
QTreeWidgetItem *item = rootItem->children.at(i);
item->par = 0;
item->view = 0;
delete item; // <<----- Aha!
}
rootItem->children.clear();
sortPendingTimer.stop();
reset();
}

因此,您对 widget->addTopLevelItems() 的调用确实会导致 QTreeWidget 获得 QTreeWidgetItems 的所有权。所以你不应该自己删除它们,或者将它们保存在 shared_ptr 中,否则你最终会遇到双重删除问题。

关于c++ - C++/Qt - 内存分配如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3000992/

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