QList 的释放分两种情况:
1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码
#include#include#include
intmain(intargc, char*argv[]){ QCoreApplication a(argc, argv); typedef struct_test{ intid; QString name; QString sex; }Por_test; QList<Por_test> slist; for(inti=0;i<;i++) { Por_test s; s.id= 1; s.name= QString("hello World!"); s.sex= QString("男"); slist.append(s); } slist.clear(); returna.exec();}
将上面代码中的slist.clear();
注释掉,内存显示为如下(任务管理器里的截图)

如不去掉的话,内存显示如下图

2.T的类型为指针的情况,这时候直接调用clear()方法将不能释放,先看代码
#include#include#includeintmain(intargc, char*argv[]){ QCoreApplication a(argc, argv); typedef struct_test{ intid; QString name; QString sex; }Por_test; QList<Por_test *> slist; for(inti=0;i<;i++) { Por_test*s= newPor_test(); s->id= 1; s->name= QString(“hello World!”); s->sex= QString(“男?”); slist.append(s); }// qDeleteAll(slist);slist.clear(); returna.exec();}
上面代码运行后的内存情况如下图

说明当T的类型为指针时,调用clear()方法并不能释放其内存
此时void qDeleteAll ( const Container & c
)方法将派上用场了,将上面代码中的注释去掉以后,
再次运行程序,此时的内存情况如下图

通过对比靓图,可以看出,内存已经释放,我们再来看下qt助手中qDeleteAll 方法的说明
void qDeleteAll ( ForwardIterator begin,
ForwardIterator end )
Deletes all the items in the range [begin,
end) using
the C++ delete
operator. The item type must be a pointer type (for example,
QWidget
*).
Example:
QList list; list.append(new Employee(“Blackpool”, “Stephen”)); list.append(new Employee(“Twist”, “Oliver”)); qDeleteAll(list.begin(), list.end()); list.clear();
Notice that qDeleteAll() doesn’t remove the items from the
container; it merely calls delete on
them. In the example above, we call clear() on the container to
remove the items.
This function can also be used to delete items stored in
associative containers, such as QMap and QHash. Only the
objects stored in each container will be deleted by this function;
objects used as keys will not be deleted.
void qDeleteAll (
const Container & c )
This is an overloaded member function, provided for
convenience.
This is the same as qDeleteAll(c.begin(),
c.end()).
上面qDeleteAll 方法的说明,已经很清楚了,如果T为指针类型时,释放内存须在clear方法前加上qDeleteAll
方法。
注意,无论是使用STL的list、vector容器,还是QList、QVector容器,用new
分配给object的内存必须用delete释放掉,不能依赖容器的deallocator机制与clear()函数等,尤其当容器中存放对象的指针或嵌套对象容器时,具体原理可参考C++ STL 源码剖析。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208780.html原文链接:https://javaforall.net
