条款16 成对使用newdelete时要采取相同形式

记住:

★若你在new表达式中使用[ ],必须在相应的delete中也使用[ ],反之亦然

------------------------------------------------------------------

当结合typedef使用时,应特别注意:如:

    typedef std::string AddressLines[4];

    std::string *pal = new AddressLines; //等同于new string[4]

    delete pal;      //错误

    delete [] pal; //正确

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

记住:

★以独立语句将newed对象置入智能指针内,若不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏

---------------------------------------------------------------------------------

问题背景:

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

使用时:

  processWidget( new Widget, priority() ); //无法通过编译,因为传入的类型不对

  processWidget( std::tr1::shared_ptr<Widget>( new Widget ), priority() ); //可以

但这种调用可能泄漏资源:原因如下:

  std::tr1::shared_ptr<Widget>( new Widget )对这句话,编译器工作时拆成两部分

    ·执行new Widget表达式;

    ·调用tr1::shared_ptr构造函数

于是在调用processWidget之前,编译器需创建代码,做以下三件事

    ·调用priority函数

    ·执行new Widget表达式;

    ·调用tr1::shared_ptr构造函数

然而编译器以何种顺序来完成以上三件事却不一定,假设是下面这样的顺序:

    ·执行new Widget表达式;

    ·调用priority

    ·调用tr1::shared_ptr构造函数

万一调用priority函数时出现异常,则new Widget返回的指针将遗失,∵其尚未被置入shared_ptr内。

避免方法:使用独立语句

  std::tr1::shared_ptr<Widget> pw( new Widget );  //在单独语句内以智能指针存储newed所得对象,此即本条款主题

  processWidget( pw, priority() );   //这个调用动作绝不至于造成泄漏

EC读书笔记系列之9:条款16、17的更多相关文章

  1. EC读书笔记系列之16:条款35、36、37、38、39、40

    条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...

  2. EC读书笔记系列之10:条款16、17

    条款18 让接口容易被正确使用,不易被误用 记住: ★“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 ★“阻止误用”的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的 ...

  3. EC读书笔记系列之1:条款1、条款2、条款3

    条款1:视C++为一个语言联邦 记住: ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分 C: Object-oriented c++: Template c++: STL 条款2:尽 ...

  4. EC读书笔记系列之20:条款53、54、55

    条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度 ...

  5. EC读书笔记系列之19:条款49、50、51、52

    条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...

  6. EC读书笔记系列之18:条款47、48

    条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...

  7. EC读书笔记系列之17:条款41、42、43、44、45、46

    条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...

  8. EC读书笔记系列之15:条款32、33、34

    条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...

  9. EC读书笔记系列之14:条款26、27、28、29、30、31

    条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...

随机推荐

  1. 【iOS开发-35】有了ARC内存管理机制,是否还须要操心内存溢出等问题?——面试必备

    答案:必需要操心啊,ARC也不是万能的. 这里主要是涉及到集合类的数据类型. 比方数组,我们定义了一个可变数组muarr1,然后把一个对象p1加到muarr1中,此时会对这个对象retain一次,相当 ...

  2. swift锁屏播放,音乐进度更新,专辑,歌手名显示

    我自己用的音乐播放器是自带的AVPlayer 导入头文件#import <MediaPlayer/MediaPlayer.h> 远程控制事件接收与处理- (void)viewWillApp ...

  3. CSS实现限制字数功能

    <div style="width:200px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; border:1 ...

  4. MatLab实现FFT与功率谱

    FFT和功率谱估计 用Fourier变换求取信号的功率谱---周期图法 clf; Fs=1000; N=256;Nfft=256;%数据的长度和FFT所用的数据长度 n=0:N-1;t=n/Fs;%采 ...

  5. 使用repeater开发出现 回发或回调参数无效 的问题

    我的就是因为没有加IsPostBack,导致在页面每次刷新时都生成一遍,造成重复绑定Repeater控件,以致事件验证出错,加上就好了 protected void Page_Load(object ...

  6. javascript 【封装AJAX】

    post function createXHR() { if (typeof XMLHttpRequest != 'undefined') { return new XMLHttpRequest(); ...

  7. C# 利用file打印日志

    public class FaceLog { public static void AppendInfoLog(string errMsg) { try { string Folder = Main. ...

  8. bootstrap之noConflict的详解

    翻开推特框架,不经发现,几乎所有的插件都会出现noConflict的写法来防止和其他的插件冲突!我们以button.js为例子,打开其源代码发现 如下: var old = $.fn.button $ ...

  9. 在windows下,git webhook使用php拉取代码的学习总结

    原来上传代码到测试服务器都是用ftp,我觉得这种方式很低效,而且容易出错,比如忘记传某个修改过文件. 现在项目的代码放在了git@osc上了,想使用他webhook,每当有push的时候,git@os ...

  10. Python爬虫:常用浏览器的useragent

    1,为什么需要修改UserAgent 在写python网络爬虫程序的时候,经常需要修改UserAgent,有很多原因,罗列几个如下: 不同Agent下看到的内容不一样,比如,京东网站上的手机版网页和p ...