智能指针类模板(中)——Qt中的智能指针
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 ;
}

析构函数没有被调用,意味着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 ;
}

打印结果说明:
意味着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 ;
}

智能指针类模板(中)——Qt中的智能指针的更多相关文章
- C++中的智能指针类模板
1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
- 智能指针类模板(上)——STL中的智能指针
智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...
- C++解析(27):数组、智能指针与单例类模板
0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...
- Qt中的标准对话框
1. Qt为开发者提供了一些可复用的对话框类型,如QMessageBox,QFileDialog,QPrintDialog, QColorDialog, QInputDialog, QProgress ...
- Qt中实现单例模式(SingleTon),大约有3种办法
Qt中实现单例模式(SingleTon) 单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂.由于单例模式很常用,Boost库中有强大的泛型单例实现,我也利用Qt ...
- C++解析(26):函数模板与类模板
0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...
- C++Array类模板编写笔记
C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...
- 学习C++模板,类模板
当我们使用向量时,会经常使用形如:vector<int> a的式子.这个表达式就是一个类模板实例化的例子,vector是一个类模板,我们给他传递模板参数(见<>里),然后创建一 ...
- C++ 函数模板&类模板详解
在 C++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数 类模板&模板类 必须区分概念 函数模板是模板,模板函数时 ...
随机推荐
- 昨天周末晚上没有出去,码了一小段,先留着kangkang。
昨天周末晚上没有出去,码了一小段,先留着kangkang. import numpy as npimport matplotlibmatplotlib.use('Agg')import matplot ...
- 洛谷 P5640 【CSGRound2】逐梦者的初心
洛谷 P5640 [CSGRound2]逐梦者的初心 洛谷传送门 题目背景 注意:本题时限修改至250ms,并且数据进行大幅度加强.本题强制开启O2优化,并且不再重测,请大家自己重新提交. 由于Y校的 ...
- Yet Another Broken Keyboard
time limit per test2 secondsmemory limit per test256 megabytesinput: standard inputoutput: standard ...
- 【Excel】删除重复值
- "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)
题目大意: n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人 问最少有几场游戏 题解: 二分 答案范围:[0,sigma a[i]] check:首先a[i]>=ans,其次 ...
- python3的ExecJS安装使用
参考官方文档安装 pip3 install PyExecJS 代码编写 import execjs ctx = execjs.compile(""" function a ...
- Django restful framework中自动生成API文档
自动生成api文档(不管是函数视图还是类视图都能显示) 1.安装rest_framework_swagger库 pip install django-rest-swagger 2.在项目下的 urls ...
- Spring Cloud Zuul 那些你不知道的功能点
本文摘自于 <Spring Cloud微服务 入门 实战与进阶> 一书. 1. /routes 端点 当@EnableZuulProxy与Spring Boot Actuator配合使用时 ...
- 使用码云,GitHub进行版本控制,并通过WebHook进行自动部署
我们通常需要在 PUSH 代码到远程仓库时,线上环境会自动进行代码同步,这时候就需要用到WebHook,它会自动回调我们设定的http地址. 通过请求我们自已编写的脚本,来拉取代码,实现与远程仓库代码 ...
- Git 实用命令记录
自从上次写了一篇 Git 入门 的相关博客以来,一直自以为自己能完全的掌握 Git,其实不然,今天一小伙问我,如何删除远程上面的一个分支,呃,不会. git branch -d 分支名 只能删除本地的 ...