8-Qt6 智能指针QPointer
生活随笔
收集整理的這篇文章主要介紹了
8-Qt6 智能指针QPointer
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
QPointer是Qt提供的一個智能指針(嚴格來說半智能),專門為自動釋放內(nèi)存資源而設計的。
QPointer所指向的對象必須是QObject或其派生類對象,當其指向的對象被銷毀時,它會被自動置NULL,但是delete還是必須手動處理。
#include <QCoreApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QTimer *timer = new QTimer;delete timer;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}return a.exec(); }此時,輸出“Label is not null”,原因是,delete后未置空,易造成野指針。
當用智能指針時,將QTimer *改為Qpointer<QTimer>即可,此時如下:
#include <QCoreApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//QTimer *timer = new QTimer;QPointer<QTimer> timer = new QTimer;delete timer;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}return a.exec(); }?此時輸出,timer is null。
總之delete和置空nullptr是對應的,但是實際情況中在經(jīng)過復制之后很容易造成部分未置空的情況。
#include <QCoreApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QTimer *timer = new QTimer;//QPointer<QTimer> timer = new QTimer;QTimer *timer2 = timer;delete timer;timer=NULL;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}if(timer2){qInfo()<<"timer2 is not null";}else{qInfo()<<"timer2 is null";}return a.exec(); }改成智能指針,如下:
#include <QCoreApplication> #include <QTimer> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//QTimer *timer = new QTimer;QPointer<QTimer> timer = new QTimer;//QTimer *timer2 = timer;QPointer<QTimer> timer2= timer;delete timer;//timer=NULL;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}if(timer2){qInfo()<<"timer2 is not null";}else{qInfo()<<"timer2 is null";}return a.exec(); }?
?額外:
在QPointer中 .和-> 是不一樣的。前者是指針的屬性,后者才是對象的屬性。
總結(jié)
以上是生活随笔為你收集整理的8-Qt6 智能指针QPointer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-Qt6 qDeleteAll内存管理
- 下一篇: 9-Qt6 QString和QChar