C++里可能出现的内存问题:
- 缓冲区溢出 : 用 vector 或 string 管理缓冲区,并通过成员函数而不是裸指针修改缓冲区
- 空悬指针/野指针:用 shar_ptr / weak_ptr
- 重复释放:用 scoped_ptr,只在对象析构的时候释放一次
- 内存泄漏:用 scoped_ptr,对象析构的时候自动释放内存
- 不配对的new[]/delete:把 new[] 通通换为 vector / scoped_array
- 内存碎片
shared_ptr用法小结
-
意外延长对象的生命周期
使用 bind 绑定了一个 share_ptr指向的一个函数或成员函数 -
线程安全问题:
- 不同的shared_ptr即使绑定了相同的对象也是线程安全的
- 对同一shared_ptr任何操作线程不安全
- 传递shared_ptr对象的技巧
shared_ptr< T >p;
- 若直接传递 f ( p ) ,由于线程安全问题,传递之前要加锁,但由于是同步调用过程,加锁后要等调用函数执行完再解锁,这样的效率太低
- 可以先加锁对 shared_ptr 拷贝后解锁,传递拷贝后的值,利用const &接收,减少一次拷贝(因为shared_ptr的拷贝需要改变引用计数,导致拷贝的代价要比普通指针高,所以尽量不拷贝)