智能指针总结

1. 智能指针的原理

(1).智能指针不是一般意义下的指针,而是一个模板类,在对模板类实例化以后会产生相似于指针的行为。经过对象来管理资源。
(2)智能指针采用一种RAII(资源分配即初始化)机制,在构造函数中实现对资源的分配及初始化,在析构函数中实现对资源的析构及回收。web

2. 智能指针的分类

C++ 中最开始是没有智能指针的,智能指针是在boost库(能够认为是C++的备胎库)中的。随着C++的发展,在C++11中引进了shard_ptr,unique_ptr,weak_ptr。数组

shard_ptr的原理

(1)shard_ptr容许赋值和拷贝,底层采用了引用计数,解决了auto_ptr 的浅拷贝问题。容许多个指针指向同一个对象。
(2)可是shard_ptr 也会产生一些问题:第一,引用计数可能会引发线程安全问题;第二,会产生循环引用的问题。
循环引用问题是由weak_ptr和shard_ptr搭配解决的,具体解决方法看
解决循环引用安全

unique_prt的原理

它是独占所指对象的。即不容许别的对象来管理当前对象所管理的资源,即不能调用拷贝构造函数和赋值运算符重载函数,是防拷贝的。
注:防拷贝的方法
将赋值运算符重载函数和拷贝构造函数只给声明并私有的访问权限。svg

weak_ptr的原理

weak_ptr是一种弱类型,是不能单独出现的,必须配合shard_ptr来使用,主要用来解决循环引用问题。函数

3. boost库中的智能指针

auto_ptr

auto_ptr是一个不安全的智能指针,这是由于它在进行赋值运算符重载函数的调用和拷贝构造函数时会造成浅拷贝,致使析构时出现问题。
auto_ptr的模拟实现及问题.net

shard_ptr

(1)boost库中的shard_ptr和C++11中的同样。shard_ptr容许赋值和拷贝,底层采用了引用计数,解决了auto_ptr 的浅拷贝问题。容许多个指针指向同一个对象。
(2)可是shard_ptr 也会产生一些问题:第一,引用计数可能会引发线程安全问题;第二,会产生循环引用的问题。线程

scoped_ptr

它和C++ 11中的unique是相似的,都是独占的,防拷贝的。scoped-array是管理对象数组的。指针

4. 为何不用普通指针代替弱类型指针

弱引用不会改变对象的引用计数,这意味着weak不会管理对象内存,在功能上相似于普通指针,可是weak会检测到对象内存是否被释放,防止非法访问内存。xml