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

来源:互联网 发布:韶山淘宝店长招聘网 编辑:程序博客网 时间:2024/02/24 04:37
条款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
原创粉丝点击