記憶體管理經驗

2021-06-29 01:32:06 字數 2920 閱讀 9329

一、記憶體管理原理:

記憶體布局:

1.全域性靜態儲存區。 2.

字串常量儲存區。 3.

**區。 4.

棧。 5.堆。

**的二進位制在**區。

全域性資料區存放全域性資料和靜態資料(其中靜態資料連線時隔離開了)。

自由儲存區和堆區類似,都是malloc,new申請的記憶體資源。

先了解堆疊的概念:

(1)   

申請,獲得,釋放過程: 1.

自動申請;棧是

os連續給;自動**。 2.

手動指定申請大小;

堆申請時,

os尋找第一塊大於程式設計師指定申請的大小的鍊錶節點,分配給程式;並在該記憶體塊前面標記大小,用於釋放;將多餘的放入空閒鍊錶;

**時候要手動釋放,否則到程式退出才釋放。

(2)   

堆相比棧:

1.      

缺點:效率較低,申請效率較低

, 訪問慢一些;程式設計師負責申請,可能申請失敗,或者忘記釋放的風險。

2.      

優點:比較大且靈活,大小是虛擬記憶體空間大小較大於固定

2m大小,大小和**靈活。

堆疊出現的問題和處理:

棧損壞:棧訪問越界,申請太大或遞迴太多導致溢位。

堆損壞:釋放或未初始化使用,賦值或轉換導致越界使用和釋放問題,越界訪問,申請太大溢位。

記憶體堆記憶體,為了獲得更自由控制記憶體的使用時間和空間:控制生命期提高記憶體效率,更大空間;

也付出了相比棧更多時間空間效率風險代價:相比棧捨棄編譯器自動控制生命,產生更多碎片導致緩慢,分配效率因需要演算法導致低下的代價,也導致了記憶體洩露容易dump機器的風險。

二、記憶體管理問題

申請問題:空指標,未初始化指標陣列變數。

使用問題:空指標,越界指標,棧失效指標,野指標,強制轉換錯誤的指標。

釋放問題:對應的釋放,引用計數;隱蔽的釋放,函式內部,多層次資料結構,子類需要釋放基類資源;都釋放好了但是中間程式呼叫邏輯改變(環境配置資料不同,有其它外部呼叫點,多執行緒)或申請資源失敗導致申請的資源沒有被釋放。

三、記憶體管理方案:

1.基本方案:

在記憶體申請,記憶體使用,記憶體釋放都要預防式的設計好。

1). 置空和判空,記憶體釋放後指標要置空否則再使用就是野指標,中間出現了資源或邏輯失敗異常導致野指標或記憶體洩露dump機,需要智慧型指標和判空處理。

2).引用計數,不要儲存對方記憶體的指標如果要儲存需要使用引用計數也就是真正的記憶體不能隨便釋放否則其它全部會出問題;

不儲存對方指標也記憶體管理混亂的需要清晰的資料結構和類設計,不儲存指標拷貝乙份鍵值結構體即可。

3). 每幀檢測,如果需要儲存記憶體指標又不使用引用計數,那麼需要遊戲每幀都檢測物件是否存在,用減少遍歷的空間來換取效率。

4).

維護乙個記憶體池

維護乙個記憶體池,過載new,delete運算子。

stl,mfc,boost,cocos2d都有這樣的記憶體池機制,目標是提高申請堆資源的效率

如果整個申請,使用到釋放都因為呼叫太複雜而導致混亂,那麼需要重新設計底層資料結構和規劃記憶體(採用引用計數,每幀檢測或者記憶體池方案):

四、記憶體指標細節:

陣列和指標,陣列特有:陣列是棧型別資源不能返回記憶體指標,陣列需要初始化,陣列字串是常量不能*p操作,陣列物件只會呼叫類的無參建構函式。

陣列和指標共有:是指向記憶體的位址和可以*p操作,記憶體都是連續的,new也有可能是虛擬記憶體的實際是硬碟被虛擬化用了,函式引數都是記憶體的位址這個位址記憶體會被棧**只有返回指向位址的位址才能得到需要的資源的位址。

五、定位記憶體dump機,記憶體洩露問題:

導致記憶體洩露的原因:

1:記得嚴格對應釋放:**中對應釋放掉記憶體,指標不要亂指搞混亂了,delete,delete一定要區分好,但是delete不能兩次除非是null指標。

2:結構體遍歷:結構體指標含有子結構體的,要遍歷釋放掉,先釋放子結構體,在釋放父結構體。

3.建構函式和虛析構函式:

建構函式失敗建議不再建構函式中初始化heap等資料或用智慧型指標;刪除指向子類的父類指標,子類用虛析構函式才能釋放。

4.函式返回值:函式返回值中不要返回內部宣告的引用,指標,靜態變數的結構體,否則導致好多問題。真的要返回,返回的是指向原有的結構體;或者是生成的新的物件,可以保證一定析構掉。

函式的形參作為返回值的本質,

指向變數的位址,改變的時變數的值,返回變數的值;

若返回的是位址則是相同的位址。所以如果傳遞指標,要返回申請的heap記憶體,則返回的指標不成功;改進是用二維的指標做形參或者不直接用形參指標做返回值即可。(但是不建議這樣做).

5.整個程式的釋放時機:整個程式中要注意,free,delete,delete的時機也會導致問題的出現。

記憶體洩露的分析方法:

1.windb分析dump機,vld.h分析記憶體洩露,更多的工具分析;

2.日誌資料分析,走讀**,除錯製造條件發現問題。

物件記憶體管理經驗談

不得不說,c c 強大的功能和靈活的操縱性,一直是我的至愛。哲人說過,任何事物都有其矛盾的兩面性,此話誠不欺我也!c 你把偉大的記憶體管理工作交給了我們,而我們卻經常用不好你。關於物件記憶體管理,最常見的問題就是 1.記憶體訪問衝突,具體表現就是程式執行時,突然跳出乙個警示框 0xfa012345 ...

團隊管理經驗

偏重於技術型創業團隊,但很有普遍意義。歸結起來,我想是 組織保證,制度保障 兩句話,涉及到目標管理 計畫管理 變更管理 風險管理 質量管理以及組織建設等多個方面,怎麼說也是乙個非常複雜的創業課題。我也在領導乙個創業團隊,3年時間,不長不短,就創業型的專案補充幾點,或許不止於專案管理本身 1 不要貪圖...

團隊管理經驗

過去3年來,miui所取得的成績,除了與很好的產品思路有關,還與團隊的執行效率密不可分。miui團隊採用扁平化的管理方式,沒有複雜繁冗的管理流程,極大地降低了溝通成本,提高了團隊執行力。設計主管任恬坦言,他們沒有像其他公司的一些奇怪的管理流程。在有些公司中,設計稿完成後,要用文件寫明頁面結構是什麼樣...