条款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()); // 这样调用就不会泄漏了。、
总结:这一章就这么结束了,感觉学到蛮多的,我发现在总结的过程中,将作者的话转换出来,也能够收获一些东西,以后要写写。