其他分享
首页 > 其他分享> > QPointer应用

QPointer应用

作者:互联网

QPointer类是一个模板类,是为了QObject提供的一种监视指针。先来看一下普通C++与QPointer指针声明方式有什么不同。

区别:

  当QPointer p2 指针引用的对象被销毁时候,p2指针会自动指向NULL。

    而p1的引用对象如果被销毁,p1则不会自动指向NULL,而是会变成野指针,所以普通的指针销毁是先Delete再复制NULL。

解释一下就是当p1引用别的对象A,而这个对象A在别的地方可能一不小心被销毁了,而p1还在指向这块内存,p1的值是没有变的,可是p1指向的这块内存已经不是以前的对象A了,这时候再调用p1就相当于变成了野指针,操作的时候会引起不可预测的风险。这时候QPointer指针就会变得很有用,当p2指向的对象销毁了,p2会自动指向NULL,而不会变成野指针。

代码

 1 #include<QList>
 2 #include<QWidget>
 3 #include<QDebug>

4 QList <QWidget*> listA; 5 QList <QWidget*> listB; 6 7 QWidget *w1 = new QWidget; 8 QWidget *w2 = new QWidget; 9 QWidget *w3 = new QWidget; 10 11 listA.append(w1); 12 listA.append(w2); 13 listA.append(w3);
14 listB.append(w1); 15 listB.append(w2); 16 listB.append(w3); 17 foreach (QWidget *w, listA) 18 { 19 if(w) 20 { 21 listA.removeOne(w); 22 delete w; 23 w =NULL ; 24 qDebug() << "listA is not null"; 25 } 26 else { 27 qDebug() << "listA is null"; 28 } 29 } 30 31 foreach (QWidget *w, listB) { 32 if(w) { 33 qDebug() << "listB is not null"; 34 } 35 else { 36 37 qDebug() << "listB is null"; 38 } 39 40 }

这时候我们来猜测一下结果,第一个foreach的时候,判断如果listA里的成员指向不为空,就删除此成员,并置为空,所以前三句应该都是“listA is not null”;

重点来看第二个foreach,来判断listB中的成员指向是否为空,到此为止,listB中的值始终是没有变得,也就是它里面的指针不为空,lista和listb相当于是一个指针列表,所以打印出来的应该是"listB is not null" 才对。

 

 

 那么怎样避免这种情况呢,使得第二个foreach的时候输出的是is null呢,QPointer的作用就出现了。我们来变换一下刚才的代码:

 1  QList <QPointer<QWidget>> listA; 
 2         QList <QPointer<QWidget>> listB;
 3         
 4         QPointer<QWidget> w1 = new QWidget;
 5         QPointer<QWidget> w2 = new QWidget;
 6         QPointer<QWidget> w3 = new QWidget; 
 7         
 8         listA.append(w1); 
 9         listA.append(w2);
10         listA.append(w3);
11         
12         listB.append(w1); 
13         listB.append(w2); 
14         listB.append(w3); 
15         foreach (QPointer<QWidget> w, listA)    { 
16             if(w)        { 
17                 listA.removeOne(w); 
18                 delete w;            
19                 w = NULL;            
20                 qDebug() << "listA is not null";        
21             }        
22             else {
23                 
24                 qDebug() << "listA is null"; 
25             }  
} 26 27 foreach (QPointer<QWidget> w, listB) { 28 29 if(w) 30 { 31 32 qDebug() << "listB is not null"; 33 } 34 else { 35 36 qDebug() << "listB is null"; 37 } 38 }

结果

 

  我们发现了,使用了QPointer之后,对于第一个foreach结果是没变化的,当到第二个foreach的时候,listB就算里面的内容没有变,依然能判断出来listB中的成员自动都指向了NULL,这就是QPointer的最大作用!

 

标签:QPointer,QWidget,应用,listB,listA,append,指针
来源: https://www.cnblogs.com/xyb617/p/12629191.html