內(nèi)存使用那些坑
1、C 內(nèi)存泄露
在類的構(gòu)造函數(shù)和析構(gòu)函數(shù)中沒(méi)有匹配地調(diào)用 new 和 delete 函數(shù)
沒(méi)有正確地清除嵌套的對(duì)象指針
沒(méi)有將基類的析構(gòu)函數(shù)定義為虛函數(shù)
當(dāng)基類的指針指向子類對(duì)象時(shí),如果基類的析構(gòu)函數(shù)不是 virtual,那么子類的析構(gòu)函數(shù)將不會(huì)被調(diào)用,子類的資源沒(méi)有得到正確釋放,因此造成內(nèi)存泄露
缺少拷貝構(gòu)造函數(shù),按值傳遞會(huì)調(diào)用(拷貝)構(gòu)造函數(shù),引用傳遞不會(huì)調(diào)用
指向?qū)ο蟮闹羔様?shù)組不等同于對(duì)象數(shù)組,數(shù)組中存放的是指向?qū)ο蟮闹羔槪粌H要釋放每個(gè)對(duì)象的空間,還要釋放每個(gè)指針的空間
缺少重載賦值運(yùn)算符,也是逐個(gè)成員拷貝的方式復(fù)制對(duì)象,如果這個(gè)類的大小是可變的,那么結(jié)果就是造成內(nèi)存泄露
2、C 野指針
指針變量沒(méi)有初始化
指針被 free 或 delete 后,沒(méi)有設(shè)置為 NULL
指針操作超越了變量的作用范圍,比如返回指向棧內(nèi)存的指針就是野指針
訪問(wèn)空指針(需要做空判斷)
sizeof 無(wú)法獲取數(shù)組的大小
試圖修改常量,如:char p=“1234”;p=‘1’;
3、C 資源訪問(wèn)沖突
多線程共享變量沒(méi)有用 valotile 修飾
多線程訪問(wèn)全局變量未加鎖
全局變量?jī)H對(duì)單進(jìn)程有效
多進(jìn)程寫(xiě)共享內(nèi)存數(shù)據(jù),未做同步處理
mmap 內(nèi)存映射,多進(jìn)程不安全
4、STL 迭代器失效
被刪除的迭代器失效
添加元素(insert/push_back 等)、刪除元素導(dǎo)致順序容器迭代器失效
錯(cuò)誤示例:刪除當(dāng)前迭代器,迭代器會(huì)失效
正確示例:迭代器 erase 時(shí),需保存下一個(gè)迭代器
auto_ptr 替換為 unique_ptr
使用 make_shared 初始化一個(gè) shared_ptr
weak_ptr 智能指針助手(1)原理分析:
(2)數(shù)據(jù)結(jié)構(gòu):
(3)使用方法:a. lock() 獲取所管理的對(duì)象的強(qiáng)引用指針 b. expired() 檢測(cè)所管理的對(duì)象是否已經(jīng)釋放 c. get() 訪問(wèn)智能指針對(duì)象
6、C++ 11 更小更快更安全
std::atomic 原子數(shù)據(jù)類型 多線程安全
std::array 定長(zhǎng)數(shù)組開(kāi)銷比 array 小和 std::vector 不同的是 array 的長(zhǎng)度是固定的,不能動(dòng)態(tài)拓展
std::vector vector 瘦身 shrink_to_fit():將 capacity 減少為于 size() 相同的大小
td::forward_list
forward_list 是單鏈表(std::list 是雙鏈表),只需要順序遍歷的場(chǎng)合,forward_list 能更加節(jié)省內(nèi)存,插入和刪除的性能高于 list
std::unordered_map、std::unordered_set用 hash 實(shí)現(xiàn)的無(wú)序的容器,插入、刪除和查找的時(shí)間復(fù)雜度都是 O(1),在不關(guān)注容器內(nèi)元素順序的場(chǎng)合,使用 unordered 的容器能獲得更高的性能六、 如何查看內(nèi)存
系統(tǒng)中內(nèi)存使用情況:/proc/meminfo
進(jìn)程的內(nèi)存使用情況:/proc/28040/status
查詢內(nèi)存總使用率:free
查詢進(jìn)程 cpu 和內(nèi)存使用占比:top
虛擬內(nèi)存統(tǒng)計(jì):vmstat
進(jìn)程消耗內(nèi)存占比和排序:ps aux –sort -rss
釋放系統(tǒng)內(nèi)存緩存:/proc/sys/vm/drop_caches
責(zé)編AJX
-
Linux
+關(guān)注
關(guān)注
87文章
11446瀏覽量
212625 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3105瀏覽量
74949 -
C++
+關(guān)注
關(guān)注
22文章
2116瀏覽量
74711
發(fā)布評(píng)論請(qǐng)先 登錄
坑死創(chuàng)業(yè)者的硬件產(chǎn)品——“十大坑”
Linux操作系統(tǒng)

Linux操作系統(tǒng)原理及應(yīng)用
七款Linux操作系統(tǒng)簡(jiǎn)介
Linux操作系統(tǒng)基本使用知識(shí),Linux操作系統(tǒng)操作流程圖文詳解

Linux操作系統(tǒng)基礎(chǔ)教程的詳細(xì)資料講解
linux操作系統(tǒng)好學(xué)嗎_要學(xué)什么
Linux操作系統(tǒng)知識(shí)講解:走進(jìn)Linux 內(nèi)存使用場(chǎng)景

評(píng)論