Linux操作系统知识讲解:避免内存使用七大坑

电子说

1.3w人已加入

描述

内存使用那些坑

1、C 内存泄露

在类的构造函数和析构函数中没有匹配地调用 new 和 delete 函数

Linux

没有正确地清除嵌套的对象指针

没有将基类的析构函数定义为虚函数

当基类的指针指向子类对象时,如果基类的析构函数不是 virtual,那么子类的析构函数将不会被调用,子类的资源没有得到正确释放,因此造成内存泄露

缺少拷贝构造函数,按值传递会调用(拷贝)构造函数,引用传递不会调用

指向对象的指针数组不等同于对象数组,数组中存放的是指向对象的指针,不仅要释放每个对象的空间,还要释放每个指针的空间

缺少重载赋值运算符,也是逐个成员拷贝的方式复制对象,如果这个类的大小是可变的,那么结果就是造成内存泄露

2、C 野指针

指针变量没有初始化

指针被 free 或 delete 后,没有设置为 NULL

指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针

访问空指针(需要做空判断)

sizeof 无法获取数组的大小

试图修改常量,如:char p=“1234”;p=‘1’;

3、C 资源访问冲突

多线程共享变量没有用 valotile 修饰

多线程访问全局变量未加锁

全局变量仅对单进程有效

多进程写共享内存数据,未做同步处理

mmap 内存映射,多进程不安全

4、STL 迭代器失效

被删除的迭代器失效

添加元素(insert/push_back 等)、删除元素导致顺序容器迭代器失效

错误示例:删除当前迭代器,迭代器会失效

Linux

正确示例:迭代器 erase 时,需保存下一个迭代器

Linux

5、C++ 11 智能指针

auto_ptr 替换为 unique_ptr

Linux

使用 make_shared 初始化一个 shared_ptr

Linux

weak_ptr 智能指针助手(1)原理分析:

Linux

(2)数据结构:

Linux

(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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分