c++智能指针

在c++里边对于内存的管理是需要程序员自己手动释放的,那为什么不像Java那样弄一个自动回收垃圾的东西呢?秉承着存在即合理的原则,c++存在没有垃圾回收这样的玩意,那肯定是为了它的运行效率,在算法竞赛中,一般c/c++时间要求是最短的。

扯远了,所以你在Java中是听不到谁在说什么智能指针的,还得是我们c++呀,c++玩家太有操作了。对于智能指针这种东西其实他是遵顼一种RAII的思想设计的。

RAII(Resource Acquisition Is Initialization):是一种利用对象生命周期来控制程序资源(如内

存、文件句柄、网络连接、互斥量等等)的简单技术。

在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在

对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做

法有两大好处:

1.不需要显式地释放资源。

2.采用这种方式,对象所需的资源在其生命期内始终保持有效

在c++里边有四种关于智能指针的类,其中一种不是完全用来管理内存的,一种是不学跟学了一样(一般用不到的),后面两种只有学起来要深入些。

1.auto_ptr

这是c98推出的一个智能指针,类似于这种思想

cpp 复制代码
template<class T>
class auto_ptr
{
public:
	auto_ptr(T* ptr)
		:_ptr(ptr)
	{}
	auto_ptr(auto_ptr<T>& sp)
		:_ptr(sp._ptr)
	{
		// 管理权转移
		sp._ptr = nullptr;
	}
	auto_ptr<T>& operator=(auto_ptr<T>& ap)
	{
		// 检测是否为自己给自己赋值
		if (this != &ap)
		{
			// 释放当前对象中资源
			if (_ptr)
				delete _ptr;
			// 转移ap中资源到当前对象中
			_ptr = ap._ptr;
			ap._ptr = NULL;
		}
		return *this;
	}
	~auto_ptr()
	{
		if (_ptr)
		{
			cout << "delete:" << _ptr << endl;
			delete 
		}
	}
		// 像指针一样使用
		T& operator*()
		{
			return *_ptr;
		}
		T* operator->()
		{
			return _ptr;
		}
	private:
		T* _ptr;

};

这就是那个没学跟学了一样的智能指针。官方文档也自个都说了不推荐使用这个智能指针。

这类指针它支持拷贝,但是不完全支持,它的拷贝只能说是鸡肋。

应为它拷贝完之后会将b1内容清空。

所以官方让我们去用unique_ptr。

2.unique_ptr

见名知意就是不准你拷贝

直接会给你报错,其实就是将拷贝给delete了,简单的实现非常简单,就不cv过来了。

3.shared_ptr

C++11中开始提供更靠谱的并且支持拷贝的shared_ptr

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。例如:

比特老师晚上在下班之前都会通知,让最后走的学生记得把门锁下。

  1. shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。

  2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。

  3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;

  4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。

这个才是最常用的,但是得注意一下循环引用。

举个循环引用的栗子:

cpp 复制代码
struct ListNode
{
	int _data;

	shared_ptr<ListNode> _next;
	shared_ptr<ListNode> _prev;


	~ListNode()
	{
		cout << "~ListNode()" << endl;
	}
};


void test3()
{
	shared_ptr<ListNode> n1(new ListNode);
	shared_ptr<ListNode> n2(new ListNode);

	n1->_next = n2;
	n2->_prev = n1;
}

这样就会出现内存泄漏,这时候我们需要weak_ptr来管理,应为weak_ptr不增加引用计数

相关推荐
码云数智-园园10 分钟前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
qq_284274051 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
禾小西1 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨1 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
徐小黑ACG2 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
优橙教育2 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
qq_284274052 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
SEO_juper2 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
西柚小萌新3 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
北极有牛3 小时前
cpp学习笔记--常量指针
java·开发语言·算法