条款17:以独立语句将newed对象置入智能指针

条款17:以独立语句将newed对象置入智能指针
如何理解这句话呢?先上代码
class Queue
{
public:
	Queue() {}
	~Queue() {}
};

int GetPriority(const int type) {return 1;}
void ProcessQueue(std::tr1::shared_ptr<Queue> queue_ptr, const int priority) {}
调用
ProcessQueue(std::tr1::shared_ptr<Queue>(new Queue), GetPriority(1));
根据正常逻辑情况,已经使用对象管理资源,应该不会导致内存泄露了吧,但是这种调用方法的确会引起内存泄露
调用函数,编译器先对实参入栈,一般顺序都是从右往左,对ProcessQueue函数,编译器要进行如下计算
①调用GetPriority(1)
②new Queue
③调用shared_ptr的构造函数
对于一些编译器的执行顺序可不确定,假如先调用②,再调用①,最后是③,看起来还是没问题吧。但是如果在调用② 时抛出异常,那么new的内存就会被遗失,没有为放到对象资源管理器shared_ptr中,导致内存泄露。
那么该如何去防止这种情况呢?分离语句
①先new创建对象
②把对象放到智能指针中(可与①合并)
③把智能指针传递到函数调用
修改调用方式
	std::tr1::shared_ptr<Queue> queue(new Queue);
	ProcessQueue(queue, GetPriority(1));
记住
以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值