Qt容器QMap,QList等包含指针时的内存释放

**如果容器内部包含指针;则在释放内存的时候,为防止内存泄漏;需要先手动调用qDeleteAll(T&);来释放容器内指针类型value所指向的堆内存,再调用clear()函数;

struct  student
{
    QString         strName;
    int             nHaveMoney[20];
}; 
QMap<int,student*>           m_MapStudent1;

void Widget::insert1()
{
    student * pStu = nullptr;
    for(int i = 0; i < 102400; i++)
    {
        pStu = new student;
        pStu->strName = "Hello";
        pStu->nHaveMoney[0] = 1009;
        pStu->nHaveMoney[19]=8990;
         m_MapStudent1.insert(i, pStu);
    }
}

//该调用很快内存泄漏崩溃
void Widget::fortest101()
{
    for(int i = 0;i < 100;i+0)
    {
        insert1();
        m_MapStudent1.clear();
        qDebug() << QDateTime::currentDateTime().toString("yyyy/mm/dd hh:mm:ss.zzz");
    }
}

//该调用内存稳定
void Widget::fortest102()
{
    for(int i = 0;i < 100;i+0)
    {
        insert1();
        qDeleteAll(m_MapStudent1);
        m_MapStudent1.clear();
        qDebug() << QDateTime::currentDateTime().toString("yyyy/mm/dd hh:mm:ss.zzz");
    }
}

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.fortest101();
//    w.fortest102();
    w.show();
    return a.exec();
}

经测试QList等容器也是如此!另外,无论是使用QList、QVector容器,还是C++模板库STL中的的list、vector容器,凡是用new分配的堆内存必须自己手动delete释放掉,不能依赖容器的deallocator机制与clear()函数等,尤其当容器中存放对象的指针或嵌套对象容器时.

另外;容器类若[key,Value]中的value是一个指针值的话,使用remove函数并不会真正调用value值的析构函数,析构value值的内存,仍然需要在remove之前手动delete ;然后再调用remove函数;

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值