effective C++ 读书笔记(11-28)

1:

     RAII 资源获得时机便是初始化时机 

      典型应用: 智能指针!

2: 为什么 auto_ptr 指针复制之后 原指针就会变成NULL  : 多分指针指向它 会被析构多次 delete 函数会多次调用

3:

     我要再次留心 stl容器的数据结构 与 特性

4: 

   对于heap-based 资源 用shared-ptr 比较好

   但是对于 栈上资源 还是用 自己的资源管理类比较好

5:

  shared_ptr 对象在引用计数 为零的时候 会delete raw ptr 

   但这不是必需的

   你可以用

例如:

shared_ptr<Mutex> mutexPtr(rawPtr,unlock); // unlock 是个函数

这种方法自己定义引用计数为零时的动作

6:

 deep copying:

   复制时 指针+指针指向的那块内存区域 都复制

7:

 delete->dangle->NULL

8:

 new :

       内存分配(operator new) 如果分配成功 则调用若干个构造函数

delete:

       若干个析构函数被调用 内存释放(operator delete)

9:

 shared_ptr 的初始化 应该以独立语句 进行

  processWidget(shared_ptr<Widget>(new Widget),process());

 应为你无法确定 new Widget 与 process() 的执行顺序 万一 process() 的执行抛出异常  则new 出来的Widget 没有没析构

  10:

    用 wrapper 类型 去包裹 传入 构造函数的 东西 

11:

    shared_ptr 定制 deletor  防止 跨DLL的delete错误

   它会使用初始化时所在的DLL中的deletor 删除对象

12:

   pass by value 不仅浪费资源 多次构造析构 

    还有可能造成 slicing 

    最好用 pass by reference-to-const 方式

 13:

      references 往往 用指针 实现出来

       因此 内置类型 往往 pass by value 更高效

14:

 任何函数返回一个指向 local 对象的reference 都会大悲剧

15:

 所有local static 对象 都需要考虑其 多线程的安全性

16:

  static_cast 不能将 const 转化为non-const 指针!

 只有const_cast 可以办到

17:

  尽可能利用 virtual func() 多态的方式 避免 dynamic_cast 

  并且万不得已 要使用 dynamic_cast 则要先判断是否转型成功

base * b = new base();

if(drived *d = dynamic_cast<drived *>(b))        // 擦 好像往往都是转型失败!

d->v();

posted @ 2011-09-08 11:45  王帅901  阅读(174)  评论(0编辑  收藏  举报