(九)智能指针
1. 原始指针
两个指针p1,p2,指向堆上的同一对象object, 如果通过p1指针将对象销毁,则p2成了空悬指针.
空悬指针
引入一个线程安全/高效的引用计数,来实现对指针的管理,就是智能指针的原理.
2. C++中可能存在的内存问题
- 缓冲区溢出,用
std::vector<char>
//std::string
或自己编写buffer class
来管理缓冲区; - 空悬指针/野指针
- 重复释放
- 内存泄漏
- 不配对的new/delete
- 内存碎片
2-5都可以使用智能指针来解决;
3. 智能指针
参考cppreference,讲解的非常详细:
ps: shared_ptr具有定制析构功能;
4. 内存碎片
<linux多线程服务端编程-使用muduo c++网络库>
应用程序的可靠性只要不低于硬件和操作系统的可靠性就行.既然不要求7*24,那么也不必害怕内存碎片,理由如下:
- 64-bit系统的地址空间足够大,不会出现没有足够的连续空间这种情况;
- 现在的内存分配器(malloc及其第三方实现)今非昔比,除了memcached这种纯以内存为卖点的程序需要自己设计分配器外,其他网络程序大可使用系统自带的malloc或者某个第三方实现.为了避免内存碎片而自己实现memory pool似乎已经不在流行了;
- linux kernel也大量用到了动态内存分配.既然操作系统内核都不怕动态分配内存造成碎片,应用程序为什么要害怕呢?
简化错误处理,用最自然的方式编写C++代码,该new的就new,该用STL的就用,不要视动态分配内存为"洪水猛兽".不要把时间浪费在解决错误的问题,应集中精力应付更本质的业务问题.
如果为了避免内存碎片,不使用STL容器,也不敢new/delete,就有些因噎费食了吧.