內存使用那些坑
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 時,需保存下一個迭代器
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
-
Linux
+關注
關注
87文章
11412瀏覽量
212246 -
內存
+關注
關注
8文章
3099瀏覽量
74853 -
C++
+關注
關注
22文章
2116瀏覽量
74525
發布評論請先 登錄
相關推薦
七款Linux操作系統簡介
Linux操作系統基本使用知識,Linux操作系統操作流程圖文詳解

評論