内存使用那些坑
1、c 内存泄露
在类的构造函数和析构函数中没有匹配地调用 new 和 delete 函数
没有正确地清除嵌套的对象指针
没有将基类的析构函数定义为虚函数
当基类的指针指向子类对象时,如果基类的析构函数不是 virtual,那么子类的析构函数将不会被调用,子类的资源没有得到正确释放,因此造成内存泄露
缺少拷贝构造函数,按值传递会调用(拷贝)构造函数,引用传递不会调用
指向对象的指针数组不等同于对象数组,数组中存放的是指向对象的指针,不仅要释放每个对象的空间,还要释放每个指针的空间
缺少重载赋值运算符,也是逐个成员拷贝的方式复制对象,如果这个类的大小是可变的,那么结果就是造成内存泄露
2、c 野指针
指针变量没有初始化
指针被 free 或 delete 后,没有设置为 null
指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针
访问空指针(需要做空判断)
sizeof 无法获取数组的大小
试图修改常量,如:char p=“1234”;p=‘1’;
3、c 资源访问冲突
多线程共享变量没有用 valotile 修饰
多线程访问全局变量未加锁
全局变量仅对单进程有效
多进程写共享内存数据,未做同步处理
mmap 内存映射,多进程不安全
4、stl 迭代器失效
被删除的迭代器失效
添加元素(insert/push_back 等)、删除元素导致顺序容器迭代器失效
错误示例:删除当前迭代器,迭代器会失效
正确示例:迭代器 erase 时,需保存下一个迭代器
5、c++ 11 智能指针
auto_ptr 替换为 unique_ptr
使用 make_shared 初始化一个 shared_ptr
weak_ptr 智能指针助手(1)原理分析:
(2)数据结构:
(3)使用方法:a. lock() 获取所管理的对象的强引用指针 b. expired() 检测所管理的对象是否已经释放 c. get() 访问智能指针对象
6、c++ 11 更小更快更安全
std::atomic 原子数据类型 多线程安全
std::array 定长数组开销比 array 小和 std::vector 不同的是 array 的长度是固定的,不能动态拓展
std::vector vector 瘦身 shrink_to_fit():将 capacity 减少为于 size() 相同的大小
td::forward_list
forward_list 是单链表(std::list 是双链表),只需要顺序遍历的场合,forward_list 能更加节省内存,插入和删除的性能高于 list
std::unordered_map、std::unordered_set用 hash 实现的无序的容器,插入、删除和查找的时间复杂度都是 o(1),在不关注容器内元素顺序的场合,使用 unordered 的容器能获得更高的性能六、 如何查看内存
系统中内存使用情况:/proc/meminfo
进程的内存使用情况:/proc/28040/status
查询内存总使用率:free
查询进程 cpu 和内存使用占比:top
虚拟内存统计:vmstat
进程消耗内存占比和排序:ps aux –sort -rss
释放系统内存缓存:/proc/sys/vm/drop_caches
责编ajx
Vishay宣布扩充其通过MIL-PRF-55342认证的E/H系列SMD薄膜电阻
AI虚拟数字人可以为企业提供哪些服务?
中芯国际2020年净利润暴涨至204.9%
“中兴事件”之后的反思:为什么中国的VC没有往芯片方面去投资?
基于仿真工具对100VN TrenchMOSFET器件设计研究
Linux操作系统知识讲解:避免内存使用七大坑
VR头显或将通过一根USB-C线缆运转,让基于PC的VR设备更快普及
华为鸿蒙系统和物联网有关系吗
化学传感器对航天航空的重要性
LED灯珠和LED贴片灯珠主要应用在哪里?
长江存储主要精力转移到128层闪存芯片上 有望在2020年大规模投产
电磁感应定律和楞次定律的关系
贯穿全产业链做数字孪生产品 智能制造有更好的选择
什么品牌的运动耳机好、运动防水防汗的蓝牙耳机推荐
电动振动试验系统的组成部分和参数要求
超声波测距与超声测距传感器工作程序图文详解
"英集芯IP6829用来代替IP6826外围简单全集成15W无线充 可重复烧录 ip6829规格书"
PEM CWT罗氏线圈的应用领域
iPhone手机的信号变弱了怎么办
如何利用人工智能解决工作中面临的挑战?