c++ | 智能指针

本文介绍了C++中智能指针的使用,包括已被废弃的auto_ptr,不可复制的unique_ptr,可共享的shared_ptr以及解决交叉引用问题的weak_ptr。重点讨论了它们的特点和使用注意事项,如右值引用、引用计数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、前言介绍

RAII 是一种解决方案,是C++语言的一种管理资源、避免泄漏的惯用法。(对堆上空间进行自动化管理,利用对象自动析构的机制)

智能指针的引入:
动态内存管理经常会出现俩种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了他们,就会引用非法内存的指针。
为了更加安全的使用动态内存,智能指针的概念就被引入了,智能指针的行为类似常规指针,重要的区别是他负责自动释放所指的对象。

智能指针:
头文件:#include < memory >

二、auto_ptr (已废弃)

注:
1、auto_ptr 智能指针不能使用同一个裸指针进行初始化多个 auto_ptr
2、拷贝构造和等号运算符都将源智能指针置空
3、不允许隐式构造

int main()
{
   
	int *p = new int (10);//定义一个指针 裸指针
	auto_ptr<int> a_p(p);//将 p 赋给 auto_ptr
	//auto_ptr<int> a_p1(p); 错误
	//auto_ptr<int> a_p2 = a_p;
	//a_p = a_p2;
	/*
	auto_ptr<int> a_p(p) 与 auto_ptr<int> a_p = p 目的一样,过程不同
	auto_ptr<int> a_p = auto_ptr<int> (p) 显式构造
	auto_ptr<int> a_p = p :
	p 会生成临时auto_ptr 对象 使用隐式构造
	使用临时对象拷贝构造a_p
	析构临时对象
	---经过这三个步骤会优化为 直接构造 a_p
	*/

	a_p.release();//返回当前指向的地址,并将当前智能指针置空
	a_p.reset();//将当前智能指针指向的内存释放,指针置空
	a_p.get();//获取智能指针内部指针
	
	return 0;
}

实现:

#ifndef MAUTO_PTR_H
#define MAUTO_PTR_H

template<typename T>
class Mauto_ptr
{
   
public:
	 explicit Mauto_ptr(T*ptr == nullptr) //关键字 explicit 防止隐式构造
		:_ptr(ptr)
	{
   }
	
	Mauto_ptr(Mauto_ptr & src)
		:_ptr(src.release())
	{
   }

	Mauto_ptr& operator=(Mauto_ptr& src)
	{
   
		_ptr = src.release();
	}
	
	~Mauto_ptr()
	{
   
		delete _ptr;
	}

	T* release()
	{
   
		T* tmp = _ptr;
		_ptr = NULL;
		return tmp;
	}
		
	void reset()
	{
   
		delete _ptr;
		_ptr = NULL;
	}
	
	T& operator*()
	{
   
	return *_ptr;
	}

	T* operator->()
	{
   
		return _ptr;
	}
private:
	T* _ptr;
};

三、unique_ptr

注:
1、unique_ptr 智能指针不能使用同一个裸指针进行初始化多个 unique_ptr
2、不允许隐式构造
3、不允许拷贝构造,不允许等号运算符重载

void fun()
{
   
	int *p = new int(10);
	unique_ptr<int> u_p;
	//unique_ptr<int> u_p1; 
	cout<<*p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值