什么是智能指针呢?
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。
智能指针是RAII的一种应用!
RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。
智能指针的作用:
1:智能管理指针的释放
2:能够像指针一样使用
3:能完成正常的赋值拷贝
智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。
常见的智能指针:
(1)auto_ptr 管理权转移,带有缺陷的设计,会释放一个空间多次,尽量不要使用它。(c++98/c++03)
(2)scoped_ptr 防拷贝,高效,简洁。不需要拷贝/赋值的时候使用。(boost库)
(3)share_ptr 共享(引用计数)管理,支持赋值/拷贝。缺陷是循环引用(weak_ptr).(boost库)
(4)weak_ptr 赋值share_ptr 解决循环引用,不增加引用计数。(boost库)
#pragma once
//模拟实现智能指针 基于引用计数的智能指针
template <class T>
class SmartPointer
{
public:
//构造
SmartPointer(T* p = 0)
:_ptr(p)
, _count(new size_t)
{
if (p)
*_count = 1;
else
*_count = 0;
}
//拷贝构造
SmartPointer(const SmartPointer& s)
{
if (this != &s)
{
_ptr = s._ptr;
_count = s._count;
(*_count)++;
}
}
//重载赋值
SmartPointer<T>& operator=(const SmartPointer<T>& s)
{
if (_ptr == s._ptr)
{
return *this;
}
ReleaseCout();
_ptr = s._ptr;
_count = s._count;
(*_count)++;
return *this;
}
//重载操作符*
T& operator*()
{
if(ptr)
return *_ptr;
}
//重载操作符->
T* operator->()
{
if (ptr)
return _ptr;
}
//析构函数
~SmartPointer()
{
if (--(*_count) == 0)
{
delete _ptr;
delete _count;
_ptr = NULL;
_count = NULL;
}
}
private:
T* _ptr;
size_t* _count;
void ReleaseCout()
{
if (_ptr)
{
(*_count--);
if ((*_count) == 0)
{
delete _ptr;
delete _count;
_ptr = NULL;
_count = NULL;
}
}
}
};
void test()
{
SmartPointer<char> p1(new char('a'));
SmartPointer<char> p2(p1);
SmartPointer<char> p3;
p3 = p2;
p3 = p1;
p3 = p3;
}