Qt 清空QHash表中new出来的对象

本文介绍了Qt中QHash在不同情况下如何正确释放内存的方法,包括直接调用clear()及手动遍历删除的方式,并提供了实际代码示例。

释放分两种情况(QHash<Key, T>):

   1.T的类型为非指针,这时候直接调用clear()方法就可以释放了。

   2.T的类型为指针的情况,这时候直接调用clear()方法将不能释放,需要把每个对象delete。

该部分摘自:https://blog.youkuaiyun.com/fanbingyu85/article/details/9704905

方式1:一个个删除节点:

QHash<QString, QUserInfo*>::const_iterator j = m_hash.constBegin();
QHash<QString, QUserInfo*>::const_iterator delIndex = j;
while ((delIndex = j) != m_hash.constEnd()) 
{
    qDebug() << delIndex.key();
    QUserInfo* userInfo = (QUserInfo*)delIndex.value();
    
    if (userInfo != NULL)
    {
        delete userInfo;
        userInfo = NULL;
    }
    ++j;
    
    m_hash.remove(delIndex.key());
}


方式2:删除全部节点:

QHash<QString, QUserInfo*>::const_iterator j = m_hash.constBegin();
while (j != m_hash.constEnd()) 
{
    qDebug() << j.key();
    QUserInfo* userInfo = (QUserInfo*)j.value();
    
    if (userInfo != NULL)
    {
        delete userInfo;
        userInfo = NULL;
    }
    ++j;
}
m_hash.clear();

我自己借鉴用的删除全部节点,执行ok。

方式3:

看其他人有用 void qDeleteAll ( const Container & c )

Example:

 QList<Employee *> list; list.append(new Employee("Blackpool", "Stephen")); list.append(new Employee("Twist", "Oliver")); qDeleteAll(list.begin(), list.end()); list.clear();
我没试验成功,大家可以试试。
<think>好的,我现在需要帮助用户解决在Qt中替换CPtrList的问题。首先,我得确认CPtrList是什么。CPtrList是MFC中的一个类,用于存储指针的链。用户可能正在将MFC项目迁移到Qt,所以需要找到对应的替代容器。 Qt常用的容器类有QList、QVector、QLinkedList、QMap等。CPtrList是链结构,存储void指针,所以可能需要类似链结构的容器。QLinkedList在Qt中确实存在,但Qt 5.15以后被标记为废弃,推荐使用std::list。不过用户可能更倾向于使用Qt自身的容器。 QList和QVector都是动态数组,但QList在Qt中对于指针类型的存储效率很高,因为它在内部存储的是指针。这可能是一个合适的替代方案。特别是QList<SomeType*>,这样可以直接存储指针,类似于CPtrList的功能。 另外,如果用户需要线程安全,可能需要提到QSharedPointer等智能指针,但CPtrList本身并不管理指针的生命周期,所以直接使用QList存储裸指针可能更接近原意。不过需要注意内存管理,Qt容器在析构时不会自动删除指针指向的对象,这点和MFC的CPtrList类似,用户需要自己管理内存。 可能还需要考虑迭代方式。CPtrList可能有特定的迭代方法,而Qt容器通常使用迭代器或C++11范围的for循环,需要用户调整代码。 总结下来,QList<YourType*>应该是主要的替代方案,如果用户需要链结构,可以用QLinkedList或std::list,但要注意QLinkedList已被废弃。此外,如果用户需要更多功能,如关联容器,QMap或QHash可能适用,但CPtrList是线性容器,所以可能不需要。 需要提醒用户注意内存管理,确保在容器析构前正确释放指针所指对象,或者使用智能指针如QSharedPointer来管理所有权,避免内存泄漏。另外,检查现有代码中对CPtrList的具体使用,如排序、查找等操作,可能需要用Qt容器的方法或算法库中的函数来替代。</think>在Qt中,可以使用以下容器替代MFC中的`CPtrList`: 1. **QList\<T*\>(推荐)** - 最接近`CPtrList`的替代方案 - 示例: ```cpp QList<MyClass*> ptrList; ptrList.append(new MyClass()); // 遍历 foreach (MyClass* item, ptrList) { // 处理item } ``` 2. **QVector\<T*\>(当需要连续内存时)** - 类似数组结构 - 适合随机访问 - 示例: ```cpp QVector<MyClass*> ptrVector; ptrVector.reserve(100); // 预分配空间 ``` 3. **std::list\<T*\>(需要链特性时)** - Qt 5.15后推荐用标准库容器替代`QLinkedList` - 示例: ```cpp #include <list> std::list<MyClass*> stdPtrList; ``` 4. **智能指针容器(推荐用于自动内存管理)** - 更安全的替代方案: ```cpp QList<QSharedPointer<MyClass>> safeList; safeList.append(QSharedPointer<MyClass>(new MyClass())); ``` **主要区别要注意**: 1. 内存管理: - Qt容器不会自动删除指针内容 - 清空容器时需要手动`qDeleteAll(*container*)`或使用智能指针 2. 迭代方式: ```cpp // Qt风格迭代 QListIterator<MyClass*> it(ptrList); while (it.hasNext()) { MyClass* p = it.next(); } // C++11风格 for(auto&& item : ptrList) { // 使用item } ``` 3. 性能特性: - QList:适合频繁插入/删除首尾元素 - QVector:适合随机访问 - std::list:需要精确控制链节点时使用 **迁移建议**: 1. 将`CPtrList::AddTail()`改为`append()` 2. `GetNext(pos)`改为迭代器遍历 3. 删除操作注意先`delete`指针再`remove` 根据实际使用场景,80%以上的`CPtrList`用例可以用`QList<T*>`直接替换,同时建议逐步改用智能指针容器提升代码安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值