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 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法