**如果容器内部包含指针;则在释放内存的时候,为防止内存泄漏;需要先手动调用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函数;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐