Effective C++ 炒冷饭 - Item 17 一口吃不成个胖子 New语句应该单独一行写

Effective C++ 炒冷饭 - Item 17 一口吃不成个胖子 New语句应该单独一行写
[原创文章欢迎转载,但请保留作者信息]
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());


你可能感兴趣的:(Effective C++ 炒冷饭 - Item 17 一口吃不成个胖子 New语句应该单独一行写)