以对象管理资源

1、以对象管理资源
先举个栗子;假设一个塑模投资行为的程序库,各种投资行为继承自一个根类
Investment.
我们再通过一个工厂函数供应我们特定的根类对象。

Investment* createInvestment(); 这个函数返回一个指向动态分配对象的指针。调用者有责任删除它。
假设f函数履行这个责任:
void f(){
Investment* pInv=createInvestment();

delete pInv;
}
这一函数看起来没问题,但其实有很多情况导致无法删除对象。
比如:1.中间有个return语句过早返回,2 continue,goto语句直接跳过delete语句。 3 区域内语句抛出异常 。 所以单纯依赖函数总是会执行delete语句是不可靠的。
那么,为了让资源总是被释放,我们可以依赖C++析构函数自动调用机制,而auto_ptr,就是智能指针正是这种作用。
void f(){
std::auto_ptr pInv(createInvestment());

}
这里体现了对象管理资源的两个关键思想:
1、获得资源后立刻(同一语句内)放进管理对象,比如这里返回的资源就被当成auto_ptr的初值。这也就是RAII(resource acquisition is initialization)
2、管理对象运用析构函数确保资源被释放。不论控制流如何离开区块,一旦对象离开作用域,其析构函数自动调用。

因为auto_ptr会自动删除所指之物,所以一定要注意不能让多个auto_ptr指向同一对象。其实,你几乎没有这个机会,因为,auto_ptr有个不寻常的性质,若通过copy构造函数,copy assignment操作符复制他们,他们变成null,而复制所得的指针获得资源的唯一拥有权。
所以这一性质也是一种限制,比如STL容器要求元素发挥正常的复制行为,因此不得用auto_ptr。
代替这一指针的是RCSP(shared_ptr),持续追踪共有多少个对象指向某笔资源,并在无人指向它时自动删除该资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值