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

相关推荐
波波0078 小时前
每日一题:C#中using的三种用法
开发语言·c#
游乐码8 小时前
c#万物之父
开发语言·c#
梓䈑8 小时前
Gflags解剖课:从DEFINE宏到命令行解析的工程化实践
c++·gflags
xiaoshuaishuai88 小时前
C# Chrome安全机制解析
开发语言·visualstudio·c#
游乐码8 小时前
c#字符串函数
开发语言·c#
yaoxin5211238 小时前
375. Java IO API - 列出目录内容
java·开发语言·python
LlNingyu8 小时前
什么是Go的接口(一)
开发语言·后端·golang
小陈工8 小时前
2026年4月5日技术资讯洞察:AI商业模式变革、知识管理革命与开源生态反击
开发语言·人工智能·python·安全·oracle·开源
Tanecious.8 小时前
蓝桥杯备赛:Day8-小红杀怪
c++·蓝桥杯
MinterFusion8 小时前
Java后端高频术语表
java·开发语言·后端·程序员·大厂面试·术语