智能指针

1:智能指针的发展历史?
2:auto_ptr/scoped_ptr/shared_ptr/weak_ptr的设计思想、缺陷?

3:模拟实现auto_ptr/scoped_ptr/shared_pr/weak_ptr 

4:分析循环引用及解决方案. 



1:智能指针的发展历史?


首先要了解RAII: RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。

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

所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。它是一个类,有类似指针的功能。


智能指针的通用实现技术是使用引用计数。

智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。每次创建类的新对象时,初始化指针就将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。


2:auto_ptr/scoped_ptr/shared_ptr/weak_ptr的设计思想、缺陷? 


2.1:auto_ptr设计思想、缺陷

设计思想:

auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板。

auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。

auto_ptr与boost库中的share_ptr不同的是,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所有,在给其他auto_ptr赋值的时候,会转移这种所有关系。

缺陷:

1)auto_ptr不能共享所有权,所以不要让两个auto_ptr指向同一个对象。

2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只调用了delete,而数组本来是要调用delete[]的。

3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如scoped_ptr。

4)auto_ptr不能装在容器里。


2.2:scoped_ptr设计思想、缺陷

设计思想:

scoped_ptr用于确保动态分配的对象能够被正确地删除。scoped_ptr有与auto_ptr类似的特性,但最大的区别在于它不能转让所有权,然而auto_ptr却会。

scoped_ptr永远不能被复制或被赋值。scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权,这种特性改进了代码的表示方式。

scoped_ptr是一种轻量级的智能指针;使用它不会使你的程序变大或变慢。它只会让你的代码更安全,更好维护。


缺陷:

1)不能共享控制权。scoped_ptr不能通过其他scoped_ptr共享控制权,因为在scoped_ptr类的内部将拷贝构造函数=运算符重载定义为私有的;

2)scoped_ptr不能用在标准库的容器中,因为容器中的push_back操作需要调用scoped_ptr的=运算符重载函数,结果就是会导致编译失败。


2.3:shared_ptr的设计思想、缺陷

设计思想:

shared_ptr是Boost库smart_ptr中最有价值、最重要的智能指针,其主要作用提供一个标准的共享所有权的智能指针。

share_ptr与scope_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用它,即引用计数为0时,才删除被包装的动态分配的对象。share_ptr也可以安全地放到标准容器中,弥补了auto_ptr因为转移语义而不能把指针放进容器的缺陷。因为shared_ptr可以被拷贝和被赋值,拷贝行为也是等价的,并且可以被比较,所以它可被放入标准库的一般容器和关联容器中。 

缺陷:

循环引用或者自引用容易造成内存泄露,可以使用weak_ptr避免 。(循环引用指的是,一个引用通过一系列的引用链,最后引用回自身)

2.3:weak_ptr的设计思想、缺陷

设计思想:

weak_ptr是为了配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手而不是智能指针。因为它不具有普通指针的行为,没有重载operator*和->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。

陷:
weak_ptr在构造/析构的时候不会增加/减少引用计数,由于不会增加引用计数,所以与普通智能指针相比,它就没法保证hold住对象,所以当要使用weak_ptr指向对象的时候,必须先将它提升为普通智能指针,如果这时候对象已经被析构,则提升会失败报错。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值