【C++】智能指针

文章详细介绍了C++中智能指针的作用,如防止内存泄漏,以及RAII原则。讨论了标准库中的std::auto_ptr、std::unique_ptr和std::shared_ptr,包括它们的特性、问题及解决策略,如shared_ptr的引用计数、线程安全问题和循环引用问题,并提出了weak_ptr作为解决方案。此外,还提到了定制删除器的概念,用于处理不同类型的资源释放。

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


目录

一、为什么需要智能指针?

二、智能指针

1.RAII

2.智能指针的完善

三、标准库中的智能指针

1.std::auto_ptr

2.std::unique_ptr

3.shared_ptr

A)shared_ptr中的引用计数 

B)shared_ptr中产生的线程安全问题

C)shared_ptr中的循环引用问题

4.weak_ptr

5.定制删除器


一、为什么需要智能指针?

在我们异常一节就已经讲过,当使用异常的时候,几个函数层层嵌套,其中如果抛异常就可能导致没有释放堆区开辟的空间。这样就很容易导致内存泄漏。关于内存泄漏,我也曾在C++内存管理一文中写过。

为了更好的管理我们申请的空间,C++引入了智能指针。

参考文章:

1.【C++】异常_

2. C++内存管理


二、智能指针

1.RAII

RAII Resource Acquisition Is Initialization )是一种 利用对象生命周期来控制程序资源 (如内存、文件句柄、网络连接、互斥量等等)的简单技术。
 
在对象构造时获取资源 ,接着控制对资源的访问使之在对象的生命周期内始终保持有效, 最后在 对象析构的时候释放资源 。借此,我们实际上把管理一份资源的责任托管给了一个对象。
这种做 法有两大好处:
  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。
template<class T>
class SmartPtr
{
public:
	SmartPtr(T* ptr = nullptr)
		:_ptr(ptr)
	{
		cout << "管理空间:" << _ptr << endl;
	}

	~SmartPtr()
	{
		if (_ptr)
		{
			delete _ptr;
		}
		cout << "释放空间:" << _ptr << endl;
	}

	
private:
	T* _ptr;
};

int main()
{
	SmartPtr<int> sp1(new int(1));

	return 0;
}

我们可以看到,智能指针的引入,极大的便利了我们管理空间。

在封装了几层的函数中抛异常,我们也能够来通过智能指针来管理好空间。

2.智能指针的完善

上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。指针可以解引用,也可以通过-> 去访问所指空间中的内容,因此: AutoPtr 模板类中还得需要将 * -> 重载下,才可让其 像指针一样去使用
template<class T>
class SmartPtr
{
public:
	SmartPtr(T* ptr = nullptr)
		:_ptr(ptr)
	{
		cout << "管理空间" << _ptr << endl;
	}

	~SmartPtr()
	{
		if (_ptr)
		{
			delete _ptr;
		}
		cout << "释放空间:" << _ptr << endl;
	}

	T& operator*()
	{
		return *_ptr;
	}

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

	T& operator[](size_t pos)
	{
		return _ptr[pos];
	}

private:
	T* _ptr;
};

class Date
{
public:
	int _y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值