智能指针类模板(中)——Qt中的智能指针
2023-09-14 09:12:37 时间
Qt中的智能指针
-QPointer
.当其指向的对象被销毁时,它会被自动置空
.析构时不会自动销毁所指向的对象
-QSharedPointer
.引用计数型智能指针
.可以被自由的拷贝和赋值
.当引用计数为0时才删除指向的对象
#include <QPointer> #include <QDebug> using namespace std; class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。 { QString m_name; public: Test(const char* name) { qDebug() << "Test(const char* name)" << endl; m_name = name; } void print() { qDebug() << "I'm" << m_name << endl; } ~Test() { qDebug() << "~Test()" << endl; } }; int main() { QPointer<Test> pt(new Test("hello world") ); pt->print(); qDebug() << "pt= " << pt << endl; return 0; }
析构函数没有被调用,意味着pt这个智能指针对象,它在生命周期结束时并没有同时的销毁所指向的堆空间里面的对象。一定要注意。此时需要手工的删除。
delete pt;
#include <QPointer> #include <QDebug> using namespace std; class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。 { QString m_name; public: Test(const char* name) { qDebug() << "Test(const char* name)" ; m_name = name; } void print() { qDebug() << "I'm" << m_name; } ~Test() { qDebug() << "~Test()" ; } }; int main() { QPointer<Test> pt(new Test("hello world") ); QPointer<Test> pt1(pt); QPointer<Test> pt2(pt); pt->print(); pt1->print(); pt2->print(); delete pt; qDebug() << "pt= " << pt; qDebug() << "pt1= " << pt1 ; qDebug() << "pt2= " << pt2 ; return 0; }
打印结果说明:
意味着QPointer类模板的对象所指向的堆空间,如果被释放了,那么所有指向这个堆空间的智能指针都会被置空。这是一个非常有用的特性,可以避免内存多次释放的问题。
QSharePointer的使用
#include <QSharedPointer> #include <QDebug> using namespace std; class Test : public QObject //在进行Qt开发时,所定义的类都必须继承自Qt中的顶层父类QObject,这样才符合Qt开发中的一些规范。 { QString m_name; public: Test(const char* name) { qDebug() << "Test(const char* name)" ; m_name = name; } void print() { qDebug() << "I'm" << m_name; } ~Test() { qDebug() << "~Test()" ; } }; int main() { QSharedPointer<Test> pt(new Test("hello world") ); pt->print(); QSharedPointer<Test> pt1(pt); QSharedPointer<Test> pt2(pt); pt1->print(); pt2->print(); return 0; }
相关文章
- [Qt教程] 第33篇 网络(三)FTP(一)
- Qt Creator介绍
- QT-Qt界面居中显示
- Qt-char*与QString互转 floatToqstring char*与QString互转 qt字符串与字符串数组操作 Qt 的QString类的使用
- Qt QGraphicsItem的使用
- Qt QStackedLayout
- Qt 关于QT_BEGIN_NAMESPACE宏的作用
- Qt部件基类——QWidget与QDialog
- QT之UDP通信
- Qt源码分析之信号和槽机制
- 【Qt】在ubuntu上为可执行程序qt创建图标(亲测)
- 【Qt】fatal error: X11/Xcursor/Xcursor.h: No such file or directory
- 3、 QT基础——第一个Qt小程序
- 基于Qt的Littlevgl移植(Windos10)
- Qt窗口永久置顶
- Qt unsigned char *与QString之间的相互转换
- 解决Ubuntu系统安装QT出错的问题:qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it
- VLC-Qt 入门指南
- QT单例模式(函数模板实现)
- Qt creator 编译错误 :cannot find file .pro qt
- Qt学习一门:直接使用QT具
- Qt Md5应用示例
- Qt foreach关键字用法(无师自通)
- 怎样在Qt中建立使用动态链接库
- QT creator使用(二):Qt项目建立、编译、运行、发布及移植