Qt容器QMap,QList等包含指针时的内存释放
如果容器内部包含指针;则在释放内存的时候,需要先调用qDeleteAll(T&);来释放容器内指针类型value所指向的堆内存,再调用clear()函数;structstudent{QStringstrName;intnHaveMoney[20];};QMap<int,student*>m_MapStudent1;//该调用很快内存泄漏崩溃void Widget::fortes
·
**如果容器内部包含指针;则在释放内存的时候,为防止内存泄漏;需要先手动调用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函数;
更多推荐
已为社区贡献1条内容
所有评论(0)