智能指针底层简单剖析

本文介绍了RAII资源管理策略,并通过一个例子阐述智能指针的必要性。接着,文章展示了如何简单实现一个智能指针,分析了拷贝构造可能导致的问题以及为什么不能采用深拷贝解决方案。最后,概述了三种常见的智能指针实现。
摘要由CSDN通过智能技术生成

很多人都误以为智能指针是一个指针,其实不是,智能指针不是指针,智能指针是一个模板类,由智能指针实例化出来的对象
具有和常规指针相似的行为,但是他能够自动的释放所指向的对象,所以称之为智能指针,如果我们用普通指针来创建一个指向
某个对象的指针,那么我们最后必须要手动释放这块空间,而智能指针它是一个类,它释放空间通过析构函数完成的,正是因为
这一层封装机制,所以智能指针才能够管理一个对象的生命周期。

一 :

RAII:资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。

为什么要有智能指针?

看接下来这个例子

因此我们想到,那就把资源的分配和初始化,放到构造函数里,资源的清理放在析构函数中。这样出了作用域,会自动调用析构函数。可以保证资源正确的分配和释放。

二  :

接下来实现一个简单的智能指针

#pragma once
#include<iostream>
using namespace std;
template<class T>
class Autoptr
{
public:
	Autoptr(T *ptr)
		:_ptr(ptr)
	{}
	~Autoptr()
	{
		
		if (_ptr)
		{
			printf("%p\n", _ptr);
			delete _ptr;
		}
	}
	T& operator*()
	{
		return *_ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
private:
	T * _ptr;
	
};
struct AA
{
	int _a1;
	int _a2;
};
void TestSmartPtr()
{
	int *p1 = new int(2);
	*p1 = 10;
	Autoptr<int>ap1(new int(2));//使类对象向指针一样,就必须重载*和->
	*ap1 = 10;
	AA* p2 = new AA[2];
	p2->_a1 = 10;
	p2->_a2 = 20;
	Autoptr<AA>ap2(new AA(2));
	ap2->_a1 = 10;
	ap2->_a2 = 20;
}

但是上面的实现如果是这样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值