Effective C++ 资源管理小结(四)

2013-01-25 17:51:26 · 作者: · 浏览: 1313

 

  条款16:成对使用new和delete时采用相同形式

  这个没什么好说的,简单的说,就是如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[] .

  特别要注意的就是使用typedef时,

  [cpp]

  typedef std::string AddressLines ;

  std::string* pal = new AddressLines; //注意,"new AddressLines"返回一个string*,就像"new string "一样

  delete pal; //行为未定义

  delete [] pal; //很好

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

  [cpp]

  processWidget(std::tr1::shared_ptr<Widget> pw(new Widget), int priority);

  可能会导致资源的泄露,为什么呢?

  因为语序的问题!

  这个语句总共完成了3件事情:

  调用 priority .

  执行 "new Widget" .

  调用 tr1::shared_ptr 的构造函数。

  他们的操作顺序有很大的弹性,如果按以下顺序执行:

  1. 执行 " new Widget " .

  2. 调用 priority .

  3. 调用 tr1::shared_ptr 的构造函数。

  [cpp]

  std::tr1::shared_ptr<Widget> pw(new Widget); // 在一个单独的语句中创建 Widget

  // 并存入一个智能指针

  processWidget(pw, priority());     // 这样调用就不会泄漏了。、

  总结:这一章就这么结束了,感觉学到蛮多的,我发现在总结的过程中,将作者的话转换出来,也能够收获一些东西,以后要写写。