条款13:以对象管理资源

·所谓资源就是,一旦用了它,将来必须还给系统。C++中最常见的资源就是动态内存分配,其他资源包括文件描述器、互斥锁、图形界面中的字型和笔刷、数据库连接、以及网络sockets。

对于手工释放资源,ro为了容易发生某些错误,会资源泄露,我们解决的方法可以把资源放进对象内,依赖C++的析构函数自动调用机制确保资源被释放。

许多资源被动态分配于heap内后被用于单一区块或函数内,它们应该再控制流离开那个区块或函数时被释放。标准库提供了auto_ptr正是针对这种形式而设计的,其析构函数自动对其所指向对象调用delete:

void f()
{
	std::auto_ptr<Investment> pInv(createInvestment());
								//调用factory函数
								//一如既往的使用PInv
								//经由auto_ptr的析构函数自动删除pInv
}

以对象管理资源的两个关键想法:

  • 获取资源后立刻放进管理对象。
  • 管理对象运用析构函数确保资源被释放。

由于auto_ptr被销毁会自动删除所指对象,所以一定要注意别让多个auto_ptr同时指向同一个对象。如果这样,对象被删除一次以上,那会是“未确定行为”。为了预防这个问题,auto_ptr有一个不寻常性质:若通过copy构造函数和copy assignment操作符赋值它们,它们会变成null,而赋值所得的指针将获取资源的唯一使用权。

有时候你的资源要有正常复制行为,这样就不能使用auto_ptr,替代方案阿是使用shared_ptr,shared_ptr可以追踪共有多少对象指向某笔资源,并在无人指向它时自动删除该资源。但是有个缺点就是无法打破环状引用(例如两个其实已经没被使用的对象彼此护指,因而好像还处在“被使用”状态)。

auto_ptr和shared_ptr两者都是在其析构函数内做delete而不是delete[]。那意味着动态分配而得的array身上使用智能指针是个馊主意。而且没有特别针对“C++动态分配数组“而设计的类似auto_ptr或shared_ptr那样的东西,那是因为vector和string几乎总是能取代动态而分配的到数组。可以看下boost::scoped_array和boost::shared_array classes,它们会提供动态分配数组。

总结

  • 为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放。
  • 两个常备使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被指物)指向null。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值