条款 13

一,以对象管理资源

1,以对象来管理资源

这里有一个类的继承体系,所有的类都继承自Base class。之后创建一个工厂函数,创建特定的Base对象。

Base *create();  //返回指针,指向Base继承体系中动态分配的对象,调用者有责任删除它
为了确保create()返回的资源总是释放,我们需要将资源放到对象里,当对象的生命周期结束时,对象的析构函数会自动释放那些资源。


2,使用auto_ptr智能指针

标准程序库提供的auto_ptr是个类指针对象,也就是所谓的智能指针,其析构函数自动对其所指对象调用delete。使用auto_ptr以避免doSomething()函数潜在的资源泄露。

void doSomething(){
    auto_ptr<Base> p(create());
    ...  //使用p,然后由auto_ptr析构函数自动删除p
}


3,auto_ptr智能指针的特点

由于auto_ptr销毁时会自动删除其所指的对象,所以一定不能让多个auto_ptr指向同一个对象。如果真是那样,对象会被删除一次以上,而那会导致不明确的行为。为了预防这个问题,auto_ptr有一个不同寻常的性质,若通过copy构造函数或copy assignment运算符复制他们,他们会变成null,而复制所得指针会得到资源的唯一所有权。

auto_ptr<Base> p1(create());  //p1指向对象
auto_ptr<Base> p2(p1);  //p2指向对象,p1 = NULL
auto_ptr<Base> p3 = p2;  //p3指向对象,p2 = NULL


4,使用shared_ptr智能指针

shared_ptr也是一个智能指针,他能持续追踪有多少指针指向某个资源,并在没有指针指向这个资源时,释放掉这个资源。但是与auto_ptr指针不同的是,shared_ptr指针的复制行为,不会转移所有权。

shared_ptr<Base> p1(create());  //p1指向对象
shared_ptr<Base> p2(p1);        //p2指向对象
shared_ptr<Base> p3 = p2;       //p3指向对象

注意:

auto_ptr与shared_ptr的析构函数中做的是delete操作而不是delete [] 动作,那就意味着在动态分配而得的array身上使用auto_ptr与shared_ptr是个坏注意。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值