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也会置空,所以不会重复释放

相关推荐
2zcode26 分钟前
基于MATLAB深度学习的乳腺钼靶影像乳腺癌智能诊断系统设计与实现
开发语言·深度学习·matlab·乳腺癌
MoonBit月兔29 分钟前
错过大赛报名?MoonBit 开源大赛- 8 月黑客松正式开启
开发语言·ai-native·moonbit
fqbqrr41 分钟前
2607d,C++细节比不上d
c++·d
^yi42 分钟前
【C++】继承的那些事儿~
c++·继承·菱形继承·隐藏·final·继承原理·多继承的指针偏移
weixin_538601971 小时前
智能体测开Day31
开发语言·python
geovindu1 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7771 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
布朗克1681 小时前
Go 入门到精通-29-测试与基准
开发语言·后端·golang·测试与基准
格林威2 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小大宇2 小时前
Python 集成 Conda
开发语言·python·conda