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();