电子说
内存使用那些坑
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
全部0条评论
快来发表一下你的评论吧 !