Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 50691
  • 排名 - 434

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-14


55条军规里,这第17条算是单看标题就能记住的规矩之一。

说的东西其实也比较简单:
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
这行语句有问题,这个复杂的参数表包含了三个动作:
  • new 一个 Widget
  • 用new的Widget做为参数执行share_ptr的构造函数
  • 执行priority
C++的某个编译器可能为了效率而自作主张,导致这三个动作的执行顺序是不确定的!因此上面的动作执行顺序可能是这样的:
  • new 一个 Widget
  • 执行priority
  • 用new的Widget做为参数执行share_ptr的构造函数
这个时候如果priority的执行出错而引发异常,就会发生内存泄漏(Memory Leak),因为new出来的Widget再也无法跟踪了。

而解决方法也很简单,不要妄图一行写完所有程序,分开来老老实实写就是了:
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());


posted on 2009-12-29 10:12 Justin.H 阅读(1512) 评论(2)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

Feedback

# re: Effective C++ 炒冷饭 - Item 17 一口吃不成个胖子 New语句应该单独一行写 2009-12-29 12:29 陈梓瀚(vczh)
VC++下不会的。  回复  更多评论
  

# re: Effective C++ 炒冷饭 - Item 17 一口吃不成个胖子 New语句应该单独一行写 2009-12-31 17:54 Justin.H
@陈梓瀚(vczh) 多谢补充!
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理