C++——智能指针类模板

1.STL中的智能指针auto_ptr

(1)生命周期结束时,销毁指向的内存空间

(2)不能指向堆数组,只能指向堆对象(变量)

(3)一片堆空间只属于一个智能指针对象

(4)多个智能指针对象不能指向同一片堆空间

需要加 #include<memory> //智能指针头文件

复制代码
#include <iostream>
#include<string>
using namespace std;
#include<memory> //智能指针头文件
class Test {
	string m_name;
public:
	Test(const char* name) {
		cout << "Hello, " << m_name << "." << endl;
		m_name = name;
	}
	void print() {
		cout << "I'm " << m_name << "." << endl;
	}
	~Test() {
		cout << "Goodbye, " << m_name << "." << endl;
	}
};
int main() {
	auto_ptr<Test> pt(new Test("nhc")); //定义智能指针pt,指向类Test的对象
	pt->print();
	
	return 0;
}

运行结果:

Hello, .

I'm nhc.

Goodbye, nhc.

一片堆空间只属于一个智能指针对象,所以下面代码只执行一次析构函数,并且堆空间对象的所有权属于pt

复制代码
#include <iostream>
#include<string>
using namespace std;
#include<memory> //智能指针头文件
class Test {
	string m_name;
public:
	Test(const char* name) {
		cout << "Hello, " << m_name << "." << endl;
		m_name = name;
	}
	void print() {
		cout << "I'm " << m_name << "." << endl;
	}
	~Test() {
		cout << "Goodbye, " << m_name << "." << endl;
	}
};
int main() {
	auto_ptr<Test> pt(new Test("nhc")); //定义智能指针pt,指向类Test的对象
	cout << "pt=" << pt.get() << endl; //get是返回堆空间的起始地址
	pt->print();
	auto_ptr<Test> pt1(pt); //定义智能指针pt1指向堆空间的pt
	cout << "pt=" << pt.get() << endl;
	cout << "pt1=" << pt1.get() << endl;
	pt1->print();
	return 0;
}

运行结果:

Hello, .

pt=00E029C8

I'm nhc.

pt=00000000 //所有权转移,有pt转给pt1

pt1=00E029C8

I'm nhc.

Goodbye, nhc.

2.STL中其他的智能指针

(1)shared_ptr 是带有引用计数机制,支持多个指针对象指向同一片内存

(2)weak_ptr 是配合shared_ptr而引入的一种智能指针

(3)unique_ptr 一个指针对象指向一片内存空间,不能拷贝构造和赋值,即不能进行所有权转移

3.QT中的智能指针

(1)QPointer

当其指向的对象被销毁时,他会自动置空;析构时不会自动销毁所指向的对象

(2)QSharedPointer

引用计数型智能指针;可以被自由的拷贝和赋值;当引用计数为0时才删除指向的对象

复制代码
#include <QPointer>
#include <QDebug>

class Test : public QObject
{
    QString m_name;
public:
    Test(const char* name) {
        qDebug() << "Hello, " << m_name << "." ;
        m_name = name;
    }
    void print() {
        qDebug() << "I'm " << m_name << "." ;
    }
    ~Test() {
        qDebug() << "Goodbye, " << m_name << "." ;
    }
};
int main() {
    QPointer<Test> pt(new Test("nhc"));
    QPointer<Test> pt1(pt);
    QPointer<Test> pt2(pt);
    pt->print();
    pt1->print();
    pt2->print();
    delete pt;
    qDebug()<<"pt = "<<pt;
    qDebug()<<"pt1 = "<<pt;
    qDebug()<<"pt2 = "<<pt;
}

运行结果:

Hello, nhc.

I'm nhc.

I'm nhc.

I'm nhc.

Goodbye, nhc.

pt = QPointer(nullptr)

pt1 = QPointer(nullptr)

pt2 = QPointer(nullptr)

当pt被删除释放后,pt1和pt2也会置空,所以不会重复释放

相关推荐
王夏奇2 小时前
Python-对excel文件操作的总览
开发语言·python·excel
knighthood20012 小时前
ROS1中source xxx.bash失效
开发语言·bash
骇客野人2 小时前
python爬虫例子,且处理反爬的网站也能爬
开发语言·爬虫·python
程序员在线炒粉8元1份顺丰包邮送可乐2 小时前
【Java 实现】用友 BIP V5 版本与飞书集成单点登录(飞书免密登录到用友 ERP)
java·开发语言·飞书·用友 bip
铁手飞鹰2 小时前
eBUS SDK Python环境安装
开发语言·python
放下华子我只抽RuiKe52 小时前
智聊机器人进阶:从 API 调试到全功能交互界面的完美落地
开发语言·人工智能·python·机器学习·分类·机器人·交互
放下华子我只抽RuiKe52 小时前
构建企业级私有化 AI:从大模型原理到本地智聊机器人全栈部署指南
开发语言·人工智能·python·深度学习·机器学习·分类·机器人
Knight_AL2 小时前
Java 中 Date 与 LocalDate 的区别
java·开发语言·数据库
问水っ2 小时前
Qt Creator快速入门 第三版 第四章 布局管理
开发语言·qt·学习