C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》

来源:互联网 发布:mysql execute into 编辑:程序博客网 时间:2024/06/06 17:36

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

利用RAII机制对对象进行指针转换的时候,需要将newed对象以独立语句置入,为什么这样做呢?我们有如下示例:

int hello();void handleA(std::trl::shared_ptr<A> pA,int hello());...handleA(new A,hello());//这样无法通过编译,A的构造函数是显示的,无法进行隐式转换,好吧,既然这样,我们换一种方法;handleA(std::trl::shared_ptr<A>(new A),hello());//这下可以不?当然可以执行呀,但是可能发生资源泄露的问题,下面我们会进行一个详细讲述。

第二个看来“合理”的handleA函数怎样执行呢?hello只是一个简单的函数调用,而第一个实参则有两部分组成:
1)执行“new A”表达式;
2)调用trl::shared_ptr构造函数。
于是在调用handleA函数之前,编译器会创建代码,做以下三种事情:
1)调用priority函数;
2)执行“new A”操作;
3)调用trl::shared_ptr构造函数;
C++的多种编译器可能会有不同的方法执行它们,但能确定的是,new A操作一定发生在trl::shared_ptr执行构造函数之前,可能选择如下方式执行它们:

1)执行“new A”操作; 2)调用priority函数; 3)调用trl::shared_ptr构造函数; 此时,试想一下调用priority函数的时候发生异常,哈哈,这下懵了吧,new A创建的对象将无法使用RAII类完成,造成资源泄露了,没办法,谁让你那样写程序呢,你指望靠运气的话,那真只能靠运气跑程序了!

放心啦,C++坑多,可是大神设计C++时候就给了解决方案了呀!避免这种问题的方法很多票,创建分离语句就可以完成呀!参看如下代码:

std::trl::shared_ptr<A> pA(new A);handleA(pA,hello());

这下不就得到解决啦,无论hello()发不发生异常,资源new A一定可以通过RAII类std::trl::shared_ptr智能指针进行销毁,资源泄露不就得到解决啦!

总结:
以独立语句将newed对象置入智能指针内,如果不这样做,一旦发生异常,可能会发费很久时间进行调试而且找不到bug!良好的设计是避免问题的良药,希望大家在C++大坑中越走越爽哈!

阅读全文
0 0