模拟实现Boost库智能指针scoped_ptr、scoped_array

2017-04-03 15:57 阅读 627 次 评论 1 条

鉴于auto_ptr指针带来的缺陷,我们引入了守卫指针即scoped_ptr,它的核心思想就是防拷贝,因为在大多数情况下用不到拷贝构造函数和赋值运算符的重载,因此我们只需要给出常用的构造函数、析构函数以及常用运算符的重载。

scoped_ptr智能指针(unique_ptr)

它的实现原理的思想是防止对象的赋值与拷贝,它与auto_ptr的共同之处在于scoped_ptr和auto_ptr都是利用了一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上的对象销毁时自动删除。

scoped_ptr如何防拷贝

①赋值运算符的重载与拷贝构造函数公有声明:不可取,原因在于:对于公有声明的函数在类外是可以对其定义的,非常不安全,无法防止别人拷贝。

②赋值运算符的重载与拷贝构造函数私有声明加定义:不可取,原因在于:类外的确无法进行访问,但是在类内却可以拷贝,依旧没有起到防止拷贝的作用。

③赋值运算符的重载与拷贝构造函数私有声明:可取,原因在于:只私有声明不定义,类外不展示,成功做到防止别人拷贝的作用。

scoped_ptr的疑惑

很多人会认为,既然不让拷贝就直接什么都不写就可以了,为什么还要私有声明,不是多此一举吗?其实这样的观点是错误不可取的。

如果你不写声明,那么编译器会自动调用系统自身的拷贝构造函数和赋值运算符重载,既然是防拷贝,编译器都为用户提供了一个公共接口了,岂不是又功亏一篑,因此,私有声明时很有必要的。

模拟实现scoped_ptr(独占内存)

scoped_ptr的总结

防止拷贝的核心就是私有声明赋值运算符的重载和拷贝构造函数,不会像auto_ptr那样移交资源的管理权,并且scoped_ptr所管理的声明周期仅仅局限于一个作用域内,无法传到作用域之外,这也就意味着他不能作为函数的返回值,不能共享所有权,因此,也就造成了功能的单一。

同时scoped_ptr也不能用于管理数组对象,因为scoped_ptr是通过delete来删除所管理的对象的,而数组对象必须通过delete[]来释放。

模拟实现scoped_array

为什么标准库中没有引入scoped_array

原因很简单,因为人家C++标准库已经有了一个更为完善的容器stl::vector来处理连续的空间,根本不需要boost库里面的scoped_array。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:模拟实现Boost库智能指针scoped_ptr、scoped_array | 术与道的分享
分类:编程素养 标签:,
1024do.com导航_术与道导航平台

发表评论


表情