(九)智能指针

1. 原始指针

两个指针p1,p2,指向堆上的同一对象object, 如果通过p1指针将对象销毁,则p2成了空悬指针.

空悬指针

引入一个线程安全/高效的引用计数,来实现对指针的管理,就是智能指针的原理.

2. C++中可能存在的内存问题

  1. 缓冲区溢出,用std::vector<char>//std::string或自己编写buffer class来管理缓冲区;
  2. 空悬指针/野指针
  3. 重复释放
  4. 内存泄漏
  5. 不配对的new/delete
  6. 内存碎片

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,就有些因噎费食了吧.

posted @ 2018-07-22 16:32  yvhqbat  阅读(132)  评论(0编辑  收藏  举报