智能指针类模板(中)——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++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数 类模板&模板类 必须区分概念 函数模板是模板,模板函数时 ...
随机推荐
- Python 定时任务的实现方式
本文转载自: https://lz5z.com/Python%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96% ...
- C++并发编程实战
第1章 你好,C++并发世界 第2章 管理线程 第3章 在线程间数据共享 第4章 同步并发操作 第5章 C++内存模型和原子类型操作 第6章 设计基于锁的并发数据结构 第7章 设计无锁的并发数据结构 ...
- plsql查询数据显示为乱码解决方案
1.首先安装plsql之后连接数据库,发现使用sql查询出来的中文数据是??,即乱码.原因,因为数据库的编码与本地的编码不一致,plsql默认加载的是本机win10的编码. 2.解决办法: 参数如下: ...
- php time() 和 $_SERVER['REQUEST_TIME']
time() 和 $_SERVER['REQUEST_TIME']效率 结果:(其中之一) 结论: time() : 执行时间在0.10 - 0.30 之间 $_SERVER['REQUEST_TIM ...
- kindEditor 修改上传图片的路径
压缩过的js类似
- Groovy元编程简明教程
同函数式编程类似,元编程,看上去像一门独派武学. 在 <Ruby元编程>一书中,定义:元编程是运行时操作语言构件的编程能力.其中,语言构件指模块.类.方法.变量等.常用的主要是动态创建和访 ...
- SpringBoot系列之外部配置用法简介
SpringBoot系列之外部配置用法简介 引用Springboot官方文档的说法,官方文档总共列举了如下用法: 1.Devtools global settings properties on yo ...
- 14-认识DjangoRESTframework
了解DjangoRESTframework 现在流行的前后端分离Web应用模式,然而在开发Web应用中,有两种应用模式:1.前后端不分离 2.前后端分离. 1.前后端不分离 在前后端不分离中,前端看见 ...
- css/js 超出部分显示省略号
1.js方法 function cutString(str, len) { //length属性读出来的汉字长度为1 if (str.length * 2 <= len) { return st ...
- python基础(33):线程(一)
1. 线程概念的引入背景 1.1 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在 ...