C++以对象管理资源

26 篇文章 0 订阅

以下转自:http://www.cnblogs.com/kane0526/p/3612428.html

先看下面一段代码:

复制代码
class Node {};

Node* CreateNode()
{
    
}

void Solve()
{
    Node *p=CreateNode();  //调用CreateNode函数
    ...
    delete p;         //释放资源
}
复制代码

这样释放资源(delete)做法是正确的。

但是,我们怎么能保证其他人在利用这个代码时在delete之前会不会使用continue语句或者return语句跳过delete,这样一来的话不就无法释放资源浪费资源了吗。

有什么办法呢?即在程序结束之前一定会自动释放资源。

auto_ptr(智能指针):其析构函数自动对其所指的函数调用delete。

void Solve()
{
    std::auto_prt<Node>p(CreateNode());
    ...                    ///经由auto_ptr析构函数自动删除p对象
}

 

它还有另外一个性质:即通过copy构造函数或者copy assignment函数对他们进行复制操作时,它们会变成null,而复制所得的指针将拥有对资源的唯一支配权。

void Solve()
{
    std::auto_prt<Node>p1(CreateNode());
    std::auto_prt<Node>p2(p1);  //p2指向对象,p1为null
    p1=p2;                      //p1指向对象,p2为null
}

 

通过上面的例子藐视auto_ptr智能指针的弊端已经显露出来了,即无法行使正常的复制行为。

怎么办?看下面。

tr1::shared_ptr(引用计数智慧指针):它不仅拥有auto_ptr智能指针的功能,最重要的是它还能进行复制行为。

复制代码
void Solve()
{
    std::tr1::shared_ptr<Node>p1(CreateNode());
    std::tr1::shared_ptr<Node>p2(p1);  //p1和p2指向同一对象
    p1=p2;           //p1和p2指向同一对象
    ...             //p1,p2同时被销毁,它们所指的对象也被自动销毁
}
复制代码

 

记住:

1、为防止资源泄露,请使用RAII对象。它们在构造函数过程中获得资源,并在析构函数过程中释放资源。

2、两个常用的RAII classes分别是auto_ptr,tr1::shared_ptr,后者更佳。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值