• (九)智能指针


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

  • 相关阅读:
    Spring(001)-Hello Spring
    actuator beans不展示
    Java读取property文件
    PostgreSQL 后端存储
    python 中global() 函数
    python项目配置文件格式
    大数据时代,数据成了研究的基石
    10w数据重建索引报错:java.lang.IllegalStateException: Batch statement cannot contain more than 65535 statements
    java学习day15--API-ArrayList--LinkedList
    java学习day14--API-集合(Collection)+List
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/9350581.html
Copyright © 2020-2023  润新知