Effective C++学习笔记(二)

Chapter 3:Resource Management

不管是动态分配内存还是互斥锁或者是网络套接字,使用完后需要归还给系统,如果忘记,比如说忘记回收内存,那么会引起memory leak。

1.Item 13:Use Objects to manage resources

之所以使用RAII(资源分配即初始化,使用类来封装资源的分配和释放)技术,是因为使用完一个资源管理对象后,会自动调用其析构函数,释放其对应的资源,但是如果直接使用new和delete,那么在new之后,delete之前可能会return神马的,导致delete操作没有进行,进而内存泄露。

引申问题:智能指针auto_ptr/shared_ptr/unique_ptr/scoped_ptr比较(include<memory>)

智能指针是在堆栈上声明并初始化使用原始指针指向堆分配的对象的类模板

auto_ptr:用一个auto_ptr对象(p1)初始化或者赋值给另一个auto_ptr对象(p2)的时候,资源的所有权将会从p1转给p2,p1成为未绑定的对象,auto_ptr只能用于管理new回来的一个对象,而不能管理动态分配的数组(会导致未定义的运行时行为),而且不能将其存储在标准库容器类型中。

msdn:http://msdn.microsoft.com/en-us/library/ew3fk483(v=vs.80).aspx

unique_ptr:当需要一个单一指针指向对象时,可以用unique_ptr来代替auto_ptr,unique_ptr可以作为容器元素,unique_ptr对象可以move,但是不能复制,即在auto_ptr中有p1=p2,但是unique_ptr中是p1=std::move(p2),unique_ptr可以管理new[]分配的数组

msdn:http://msdn.microsoft.com/en-us/library/vstudio/ee410601.aspx

shared_ptr:tr1::shared_ptr,当需要多个指针指向同一个对象的时候,可以用share_ptr(通过实现引用计数来管理资源)来代替auto_ptr,但是share_ptr存在cycle reference的问题(两个不再使用的对象互相指向对方,导致无法删除),不过这个情况可以通过使用tr1::weak_ptr(只引用,不计数)来打破。shared_ptr构造函数有第二个参数说明一个“deleter”(可以是function,也可以是function object,当引用计数器为零的时候被调用。因为shared_ptr的默认行为是当引用计数器为零的时候,删除其指向的内容,可是有时我们并不想这样做,比如我们可能只是想进行unlock mutex。不过,auto_ptr没有此操作,它只有delete)。shared_ptr还有一个好处是可以避免“cross DLL problem”(该问题出现于,new在一个DLL,而delete是在另一个DLL,因而易导致runtime errors),shared_ptr使用来自于创建它的DLL的delete。shared_ptr可以避免很多client error。不过它的开销比raw pointer要大,而且速度也慢,也会使用辅助动态内存。更多shared_ptr可以参考item14、item18及item54

wiki:http://zh.wikipedia.org/wiki/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88#shared_ptr_.E5.92.8C_weak_ptr

msdn:http://msdn.microsoft.com/en-us/library/vstudio/bb982026.aspx

scoped_ptr:主要用于指针在某个作用域中有效,当指针离开此作用域的时候,会自动释放,其复制构造函数和赋值函数都是私有的,所以不能进行指针传递,因而比auto_ptr更安全。

相关链接:http://yaronspace.cn/blog/archives/1493

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值