[Effective C++ --017]以独立语句将newed对象置入智能指针
这一节也比较简单,先假设我们有如下的函数:
int foo();
void memFoo(shared_ptr<T> pw, int foo);
现在假设我们要调用memFoo函数:
memFoo(new W, foo());
但是这样写编译是通不过的,我们可以改造为:
memFoo(shared_ptr<p>(new W), foo());
这样编译就没有问题了,但是却可能出现内存泄露问题,为什么呢?
因为编译器在产出一个memFoo调用码之前,必须先核对即将被传递的各个实参,即在调用memFoo()之前,编译器必须做3件事
1.调用foo()函数
2.执行"new W"
3.调用shared_ptr构造函数
问题就出在这三个的调用顺序上,C++并不能保证上面3个步骤总是按照1~3的顺序来完成的。如果出现以下的顺序
1.执行"new W"
2.调用foo()函数
3.调用shared_ptr构造函数
在2的时候,foo如果返回了错误,抛出异常,那么1中申请的内存将无处释放,导致泄露。
要解决这个问题也比较简单,我们可以挨步来进行调用操作。
shared_ptr<p> pw(new W); // 用智能指针存储newed对象
memFoo(w, foo());
◆总结
1.以独立语句将newed对象存储于智能指针中。如果不这样做,一旦异常被抛出,有可能导致难以觉察的资源泄露。
[Effective C++ --017]以独立语句将newed对象置入智能指针的更多相关文章
- Effective C++(17) 以独立语句将newed对象置入智能指针
问题聚焦: 使用了资源管理对象(如智能指针),就一定是安全的吗?显然不是. 资源泄露发生可能在于,在“资源被创建”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰. 看下 ...
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
对于函数: int priority(); void processWidget(std::tr1:: shared_ptr<Widget> pw,int priority); 调用 ...
- 条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)
NOTE: 1.以独立语句将newed对象存储于智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏.
- Effective C++ -----条款17:以独立语句将newed对象置入智能指针
以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.
- 条款17:以独立语句将newed对象置入智能指针
请牢记: 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露. 假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widg ...
- 《Effective C++》——条款17:以独立语句将newed对象置入智能指针
假设有如下两个函数: int priority(); void processWidget(std::tr1::shared_ptr<Widget>pw, int priority); 对 ...
- 【17】以独立语句将newed对象置入智能指针
1.为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr<Widget> pw,int priority). 调用方法 processWidget ...
- [EffectiveC++]item17:以独立语句将newed对象置入智能指针
Store newed objects in smart pointers in standalone statements
- 以独立的语句将new对象置入智能指针
以独立的语句将newed对象置入智能指针: processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority()); 我们在 ...
随机推荐
- 解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值: @RequestMapping(method = RequestMethod.POST) @ResponseBod ...
- 【转】10分钟搭建NDK的Android开发环境
原文网址:http://blog.csdn.net/u012176591/article/details/23018913 作者:金良(golden1314521@gmail.com) csdn博客: ...
- Breaking parallel loops in .NET C# using the Stop method z
List<, , , , , , , , , }; Parallel.ForEach(integers, (int item, ParallelLoopState state) => { ...
- win7(64位)+IE8+QC9.0
环境win7(64位)+IE8+QC9.0出现的问题IE8访问QC9.0有时访问登录显示正常,但是有时访问QC页面无法显示正常,然后在ie8中安全中设置“启用内存保护帮助减少联机攻击*”也无法找到该项 ...
- 为什么浏览器User-agent总是有Mozilla字样(User-agent String里的历史故事)【搜藏】
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ...
- 玩一个:可以显示任何xml树结构的xaml定义
学习中, 玩一玩. 效果如下.Xaml随后. <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio ...
- HOG:从理论到OpenCV实践
(转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义: locally normalised ...
- 嵌入式开发应该掌握的一些Linux命令
Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...
- [转]常用的130个vim命令
原帖地址:http://www.oschina.net/news/43167/130-essential-vim-commands 从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编 ...
- A Tour of Go Map literals continued
If the top-level type is just a type name, you can omit it from the elements of the literal. package ...