网站开发与设计开题报告,青岛网站建设方案外包,免费微信小程序开发平台,做网站用什么主题目录 前言正文一、理论介绍1、QPointer2、QScopedPoint3、QSharedPoint4、QWeakPoint 二、实战演练1、QPoint2、QScopedPoint3、QSharedPointa、示例一b、示例二 4、QWeakPoint END、总结的知识与问题 参考 前言
智能指针的使用#xff0c;对很多程序员来说#xff0c;都算是… 目录 前言正文一、理论介绍1、QPointer2、QScopedPoint3、QSharedPoint4、QWeakPoint 二、实战演练1、QPoint2、QScopedPoint3、QSharedPointa、示例一b、示例二 4、QWeakPoint END、总结的知识与问题 参考 前言
智能指针的使用对很多程序员来说都算是比较高深的存在但又老是感觉这是一个值得去掌握且需要去掌握的东西所以这次下定决心来掌握一下Qt的智能指针的使用当然最常用的肯定是QSharedPoint这个了其他的应该也就是顺带着讲一讲并且普及一些知识从而让自己的能力更上一层楼把。
正文
一、理论介绍
1、QPointer
QPointer是Qt提供的空安全的智能指针它用于解决悬挂指针的问题。QPoint在对象被删除后会自动被设置为nullptr,避免访问已经无效的对象它类似于普通指针但提供了一些安全检查。 总结来说就是: 当你创建一个对象然后使用QPointer指向这个对象若出现delete 了那个对象但是未将那个对象置空的情况的话判断的时候直接判断QPointer对象就可以知道到底是真的删除了那个对象还是假的删除了。避免了悬挂指针的问题。 QPoint 充当一个管家的角色对真正的指针做好判断。 2、QScopedPoint
QScopedPoint 是Qt提供的独占式的智能指针用于管理动态分配的对象QScopedPoint 在超出作用域时自动删除对象确保对象在不再需要时被正确释放。
3、QSharedPoint
QSharedPoint 是Qt提供的共享引用计数的指针可用于管理动态分配的对象。它通过引用计数跟踪对象的引用次数当引用次数归零时会自动删除对象。可以通过多个QSharedPoint共享同一个对象对象会在最后一个引用者释放它时才会被删除。
4、QWeakPoint
QWeakPoint 是Qt提供的弱引用智能指针用于解决循环引用的问题。QWeakPoint 可以引用由QSharedPoint管理的对象但不会增加引用计数的次数。QWeakPoint需要转换成QSharedPoint才能访问对象当引用计数为0时访问会失败。
二、实战演练
1、QPoint
MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include QPointer
#include QDebug
class MyClass : public QObject
{Q_OBJECTpublic:MyClass(const QString name): m_name(name){qDebug() MyClass 构造函数名称为:m_name;}~MyClass(){qDebug() MyClass 析构函数名称为:m_name;}QString getName() const {return m_name;}private:QString m_name;
};#endif // MYCLASS_H
main.cpp
#include QCoreApplication
#include QPointer
#include QDebug
#include MyClass.hint main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyClass *obj new MyClass(test);QPointerMyClass myObject(obj);if (myObject){qDebug() 对象存在名称为 myObject-getName();}else{qDebug() 对象不存在;}delete obj;if (myObject){qDebug() 对象存在名称为 myObject-getName();}else{qDebug() 对象不存在;}return a.exec();
}2、QScopedPoint
void MainWindow::TestQScopedPointer()
{useResource();qDebug() useResource 函数执行完毕;
}void MainWindow::useResource()
{QScopedPointerResource scopedResource(new Resource());;//执行一些操作使用资源qDebug() --- 使用资源 ;
}QScopedPoint 在适当的时候会自动调用析构函数释放资源。
结果
Resource 构造函数
--- 使用资源
Resource 析构函数
useResource 函数执行完毕3、QSharedPoint
a、示例一
#include QSharedPointer
#include QScopedPointer
#include QDebug
// 假设的图形对象类
class GraphicObject {
public:GraphicObject() { qDebug() GraphicObject created; }~GraphicObject() { qDebug() GraphicObject destroyed; }// 具体的图形对象操作
};
// 文档对象类
class Document {
public:Document() { qDebug() Document created; }~Document() { qDebug() Document destroyed; }// 添加图形对象到文档void addGraphicObject(QSharedPointerGraphicObject graphicObject) {graphicObjects.append(graphicObject);}// 具体的文档操作
private:QListQSharedPointerGraphicObject graphicObjects;
};
int main() {// 使用 QSharedPointer 确保图形对象的自动释放QSharedPointerGraphicObject graphicObject(new GraphicObject);// 使用 QScopedPointer 确保文档对象的自动释放QScopedPointerDocument document(new Document);// 将图形对象添加到文档document-addGraphicObject(graphicObject);// 注意在这里graphicObject 和 document 会在适当的时候自动释放return 0;
}
b、示例二
#ifndef MYSHAREDCLASS_H
#define MYSHAREDCLASS_H
#include QPointer
#include QDebug
class MySharedClass : public QObject
{Q_OBJECTpublic:MySharedClass(int value): m_iValue(value){qDebug() MySharedClass 构造函数值为:m_iValue;}~MySharedClass(){qDebug() MySharedClass 析构函数值为:m_iValue;}void setValue(int value){m_iValue value;}int getValue() const{return m_iValue;}private:QString m_name;int m_iValue;
};
#endif // MYSHAREDCLASS_H
void MainWindow::TestSharedPointer()
{//先用一个智能指针指向一个对象QSharedPointerMySharedClass pointer1(new MySharedClass(10));{//通过复制构造函数 让引用1QSharedPointerMySharedClass pointer2 pointer1;qDebug() --- pointer1 的值:pointer1-getValue();qDebug() --- pointer2 的值pointer2-getValue();//实际上都是对同一个对象进行操作pointer2-setValue(20);qDebug() ---w pointer1 的值:pointer1-getValue();qDebug() ---w pointer2 的值pointer2-getValue();}qDebug() ---w pointer1 的值:pointer1-getValue();//之后智能指针超出作用域之后会自动析构掉
}4、QWeakPoint
#ifndef MYWEAKCLASS_H
#define MYWEAKCLASS_H#include QSharedPointer
#include QWeakPointer
#include QDebugclass ObjectB;class ObjectA
{
public:ObjectA(const QString name) : m_name(name){}~ObjectA(){qDebug() objectA 析构函数名称为:m_name;}void setObjectB(const QSharedPointerObjectB objectB){m_objectB objectB;}
private:QString m_name;QWeakPointerObjectB m_objectB;
};class ObjectB
{
public:ObjectB(const QString name): m_name(name){}~ObjectB(){qDebug() Object 析构函数名称为:m_name;}void setObjectA(const QSharedPointerObjectA objectA){m_objectA objectA;}private:QString m_name;QSharedPointerObjectA m_objectA;
};#endif // MYWEAKCLASS_H
void MainWindow::TestWeakPointer()
{QSharedPointerObjectA objectA(new ObjectA(ObjectA));QSharedPointerObjectB objectB(new ObjectB(ObjectB));objectA-setObjectB(objectB);objectB-setObjectA(objectA);qDebug() 程序结束;
}END、总结的知识与问题
参考
1、[Qt杂谈8.浅谈Qt智能指针那些事](https://www.cnblogs.com/luoxiang/p/17927569.html)