2014年3月3日
摘要: 1、类中没有指针,如果对象构造过程中出现异常,C++保证已经构造好的那一部分自动销毁。注意:这里不是调用析构方法,而是编译器在你的构造方法中插入了一些代码,保证对已经构造好的对象析构。2、类中有指针,比如有a, b两个指针。对象构造时,a初始化完成,b抛出异常,C++只会对已经构造好的对象析构,而不会对已经初始化好的指针执行delete。因此资源泄漏。3、注意,这种情况下,绝不会调用析构方法,因为C++只会析构已经构造完成的对象。接着思考,在堆上分配对象,把指针传出来,对指针delete,可行吗? 不可行,因为构造过程出现异常,指针是传递不出来的。外部的指针还是null。4、思考:为什么C+. 阅读全文
posted @ 2014-03-03 20:32 Andy Niu 阅读(417) 评论(0) 推荐(0) 编辑
摘要: 1、在堆上获取的动态资源,用户忘记delete,或者由于异常导致没有没执行到delete,都会造成资源泄漏。2、我们知道,栈上的对象,离开作用域,必定要执行析构方法。即使抛出异常,会堆栈回滚,保证已经构造的对象进行析构。3、因此,可以使用栈上的对象,管理资源,在析构方法中释放资源,保证不会资源泄漏。4、考虑更一般化的资源,对于互斥体的加锁,解锁,也是同样的情况,需要保证互斥体一定会解锁。5、对资源管理的类,就是智能指针。因此,需要对不同类型的对象进行管理,智能指针是模板类,在栈上分配,行为像指针。常用的智能指针有auto_ptr,shared_ptr。注意,智能指针默认的删除动作是delete 阅读全文
posted @ 2014-03-03 19:49 Andy Niu 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 相对于C语言,C++增加了异常机制。考虑,异常解决了什么问题,又带来了什么问题。异常解决了什么问题:1、问题检测与问题处理相分离。2、C语言只是返回一个整数,而异常带有上下文信息,方便找出问题。3、C语言返回的整数,可能忘记检查,而异常不可忽略,必须处理。4、异常可以跳级,发生异常后,堆栈回滚,保证栈上的对象析构。异常带来了什么问题:1、代码膨胀。抛出异常,保证栈上的对象析构,编译器必须插入一些代码。2、效率低,抛出异常,必然有临时对象的产生。 阅读全文
posted @ 2014-03-03 19:24 Andy Niu 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 1、隐式类型转换有两种情况:单个形参构造方法和隐式类型转换操作符。注意:隐式类型转换不是把A类型的对象a,转化为B类型的对象b,而是使用a对象构造出一个b对象,a对象并没有变化。2、单个形参构造方法包括两种情况:声明只有单个形参;或者声明有多个形参,但是除了第一形参,其他的形参都有默认值,也就是说,只要单个形参就能构造对象。 注意:默认形参必须从右向左进行。思考为什么? 调用方法的时候,从左到右使用实参初始化形参,没有提供实参,就使用默认形参值,因此默认形参必须从右向左进行。比如,有5个形参,后面三个有默认值,调用方法的时候,提供三个实参,后面两个使用默认值。3、隐式类型转换操作符,是一种.. 阅读全文
posted @ 2014-03-03 19:09 Andy Niu 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 1、方法调用的方式有:像过程一样调用,嵌套调用,递归调用,回调方法。2、考虑回调方法,回调方法的典型情况是:事件驱动程序和多线程。事件驱动比如:按钮的点击事件。多线程,就是把方法传递给线程。3、考虑,一个方法同时传递给多个线程,这个方法的执行流会重叠,不可预料。举个例子,几个人同时使用一个机器加工原料,肯定乱套。因此,线程方法不同于一般的方法调用,可以认为,每个线程都有自己的调用堆栈。对于共享数据,需要进行同步控制。同时,应该避免使用局部static对象,因为一个线程的修改,其他的线程也受到影响。 阅读全文
posted @ 2014-03-03 18:41 Andy Niu 阅读(609) 评论(0) 推荐(0) 编辑