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