/* <
* 智能指针与普通指针 最明显区别普通指针
* 要手动去释放,智能指针出了作用域自动释放
* 完全不用担心有内存忘记释放的操作
* >
* 智能指针
* 1-QScopedPointer 区域指针
* 2-QSharedPointer 智能指针(强引用计数指针)可以拷贝多个赋值只是增加 引用计数(当引用计数归0释放数据内存空间)
* 3-QWeakPointer 弱引用计数指针
* 4-QEnableSharedFromThis
* 5-指针博大精深奈何鄙人一叶障目,怎见泰山,它日重游在做理解。
*/
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QScopedPointer> //智能指针
#include <QSharedPointer>
struct X{
X(){
qDebug()<<"()fun_x";
}
~X(){
qDebug()<<"~()fun_x";
}
void fun_x(){
qDebug()<<"fun_x";
}
};
template<class T> //重写清理函数
struct Cleanup{
static void cleanup(T* x)
{
qDebug()<<__PRETTY_FUNCTION__; //打印 方法信息
delete x;
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
///测试智能指针 QScopedPointer
{//作用域
QScopedPointer<X,Cleanup<X>> qsp_x(new X()); //打印()fun_x
if(qsp_x)
{
qsp_x->fun_x(); //打印fun_x
}
else {
}
} //打印~()fun_x 出作用域释放
///测试智能指针 QScopedPointer
{//作用域
QScopedArrayPointer<X> qsp_X(new X[2]); //new 一个数组 在Cleanup里面是delete []p
qsp_X->fun_x(); //< 禁止拷贝操作(浅拷贝)
qsp_X[0].fun_x();//真香啊数组下标访问 //假如多个拷贝操作,同一块内存空间将会被多个指针
qsp_X[1].fun_x(); //指向那么在释放一个指针的时候delete就会将唯一
} //一块隐式共享区域释放,其他指针将不受控制 >
qDebug()<<endl;
///测试智能指针 QSharedPointer 为共享内存而生
{
QSharedPointer<X> qhp_x(new X()); //内置:引用计数 多个此指针可以指向一块内存空间释放时不冲突
QSharedPointer<X> qhp_x1(qhp_x); //可以拷贝操作,每一次的拷贝都会让引用计数+1,指针的释放
QSharedPointer<X> qhp_x2=qhp_x; //引用计数只是-1,当引用计数为0的时候 彻底释放数据内存空间
//此时:引用计数 为3
/*qhp_x->fun_x(); //调用结构体的方法->
X& ref_x=*qhp_x; //引用赋值
ref_x.fun_x();*/ //调用结构体的方法 .
X* test_X=new X();
X* test_y=new X();
QSharedPointer<X> qhp_x_a(test_X); //test_X与qhp_x_a指向同一块内存空间
qhp_x_a.reset(test_y); //有参数:清空它所指向的对象,并且指向新的内存空间
//qhp_x_a.reset(); //无参数:清空它所指向的对象,并为空
//当指针指向 基类或派生类 可以通过 动态 转换--(类似于普通指针)
//qhp_x_a.constCast<>(); //const 转换成 非const
//qhp_x_a.staticCast<>(); //静态转换
//qhp_x_a.dynamicCast<>();//动态转换
}
/// 弱引用计数 指针 < 用于相互引用,class A有指针要指向B-class B有指针要指向A
/// 强引用计数 指针会导致不能正常释放内存空间,因为引用计数始终不为0
/// 用弱引用计数指针不会增加 引用计数 > 有待加深
QWeakPointer<X> qwp_x;
//qwp_x-> 弱引用计数 指针无法正常访问函数
QSharedPointer<X> qqshar_x=qwp_x; //引用计数+1
qqshar_x->fun_x();
///测试智能指针
///QEnableSharedFromThis 返回this指针及解决办法,让引用计数归一 有待加深
return app.exec();
}
QT-智能指针
最新推荐文章于 2025-03-11 17:16:57 发布