为什么会有智能指针?
在我们现实生活中有这样一个使用场景,每次我们new或者malloc了一块空间,完了必须需要我们手动delete或者free释放这块空间,否则会出现内存泄漏。但是,实际应用中程序未必都会按照顺序执行到释放空间那一步,有时候会在中间部分抛出异常使执行流发生跳转或者发生其他状况,总之代码未按照我们期望的那样去执行,就有可能导致内存泄漏。这时候我们就引入智能指针(自动化管理指针所指向的内存资源的释放),主要是利用RAII机制,RAII它是在面向对象语言中的一种惯用法。资源分配以及初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
智能指针的发展史:
第一个阶段(C++98):
auto_ptr:自动指针,它的主要思想是管理权转移,但其存在很大的缺陷,当要进行拷贝构造或者赋值相关操作时,原来的智能指针就失去意义,此时只有新的智能指针可以使用。简单点说,就是任何时候只能有一个智能指针指向那块空间,这样在使用上造成了很大的不便。
第二个阶段(C++03):
即第三方库Boost库中的智能指针:
scoped_ptr:守卫指针,它的主要思想就是防拷贝。
shared_ptr:共享指针,顾名思义就是共享同一块空间,它的主要思想是引入引用计数,但存在循环引用的缺陷。
weak_ptr:弱指针,它主要用来配合共享指针解决共享指针的循环引用的缺陷。
第三阶段(C++11):
unique_ptr:如同boost库中的scoped_ptr,主要思想就是防拷贝。
shared_ptr:它的主要思想是引入引用计数,但存在循环引用的缺陷。
weak_ptr:弱指针,它主要用来配合共享指针解决共享指针的循环引用的缺陷。
auto_ptr/scoped_ptr/shared_pr/weak_ptr的设计思想、缺陷?