智能指针详解
Posted zhou753099943
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能指针详解相关的知识,希望对你有一定的参考价值。
重点:学习智能指针,看这偏博客就够了,讲得很详细,特别用心去写的博客
原文出自:http://www.cnblogs.com/Lynn-Zhang/p/5699983.html
随笔 - 48 文章 - 2 评论 - 5
智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr
什么是RAII?
RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。
RAII又叫做资源分配即初始化,即:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
为什么要使用RAII?
在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素。比如:网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,所以,我们在编程使用系统资源时,都必须遵循一个步骤:- 申请资源;
- 使用资源;
- 释放资源。
第一步和第三步缺一不可,因为资源必须要申请才能使用的,使用完成以后,必须要释放,如果不释放的话,就会造成资源泄漏。
什么是智能指针?
所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。它是一个类,有类似指针的功能。
智能指针的实现原理
当类中有指针成员时,一般有两种方式来管理指针成员:- 一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;
- 另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。
常见的智能指针
包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost::intrusive_ptr
Boost库的智能指针(ps:新的C++11标准中已经引入了unique_ptr/shared_ptr/weak_ptr):
auto_ptr 独占所有权,转移所有权
第一种实现:最开始auto_ptr的成员变量主要有T* _ptr 和 bool _owner,主要实现原理是在构造对象时赋予其管理空间的所有权,在拷贝或赋值中转移空间的所有权,在析构函数中当_owner为true(拥有所有权)时来释放所有权。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
template
<
typename
T>
class
AutoPtr
public
:
//构造函数
explicit
AutoPtr(T* ptr = NULL)
:_ptr(ptr)
, _owner(
true
)
//拷贝构造
AutoPtr(AutoPtr<T>& ap)
//参数不能写成const的,这里要修改ap对象的成员<br> :_ptr(ap._ptr)
, _owner(
true
)
ap._owner =
false
;
//转让权限
//赋值运算符重载
AutoPtr& operator=(AutoPtr<T>& ap)
if
(
this
! = &ap)
delete
this
->_ptr;
this
->_ptr = ap._ptr;
// 转让权限
this
->_owner =
true
;
ap._owner =
false
;
return
*
this
;
//析构函数
[C++11新特性] 智能指针详解
|