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

相关推荐
于小猿Sup3 分钟前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y17 分钟前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手21 分钟前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人1 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生1 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS2 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣2 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye100862 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#
AI科技星2 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路2 小时前
C++ 多线程与并发
java·jvm·c++