QStandardItemModel调用appendRow()时是否会接管项的所有权?
QStandardItemModel调用appendRow()时是否会接管项的所有权?
你好呀!这个问题其实是Qt开发者刚接触QStandardItemModel时很容易纠结的点,我来给你把逻辑理得明明白白,彻底避开内存坑~
首先给你吃个定心丸:QStandardItemModel调用appendRow()(包括传入rowList的重载版本)时,确实会完全接管你传入的QStandardItem对象的所有权。Qt的父子对象内存管理机制在这里是完全生效的,虽然可能你没在文档最显眼的地方看到明确标注,但这是Qt容器类组件的通用设计逻辑,绝对可以放心依赖。
针对你提到的具体场景,我再拆解开说:
- 当你用
new在堆上创建QStandardItem,然后调用model->appendRow(item)时,这个item会立刻成为模型的"子对象",模型会把它的生命周期纳入自己的管理范畴。 - 你的m_GenerateProgramModel是类成员变量,只要它的生命周期正常(比如和你的宿主类同生共死),那你完全不需要手动
delete这些item。当模型本身被销毁的时候,它会自动递归地删除所有下属的QStandardItem,从根节点到叶子节点一个不落,不会造成内存泄漏。 - 这里要特别注意一个禁忌:绝对不要在模型还存活的时候,手动delete已经传给模型的item!那样会导致模型在销毁时,尝试再次删除已经被你释放的内存,直接触发双删崩溃,这是一定要避开的。
另外补充一个特殊情况:如果你之后用takeRow()这类方法从模型里移除某个item,这时候模型会主动释放对该item的所有权。这时候这个item的生命周期就需要你自己来管理了——要么手动delete它,要么把它添加到另一个QStandardItemModel中(另一个模型会接管它的所有权)。
举个对应你代码的正确示例:
auto* item = new QStandardItem("text"); m_GenerateProgramModel->appendRow(item); // 这里完全不需要delete item!模型会在销毁时自动处理
总结下来,你现在的写法完全没问题,只要别手动去删那些已经交给模型的item,就既不会有内存泄漏,也不会有双删崩溃的风险~
内容来源于stack exchange
相关产品推荐
相关产品推荐

