




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言中的指針和內(nèi)存泄漏在使用 C 語言時,您是否對花時間調(diào)試指針和內(nèi)存泄漏問題感到厭倦?如果是這樣,那么本文就適合您。您將了解可能導致內(nèi)存破壞的指針操作類型,您還將研究一些場景,了解要在使用動態(tài)內(nèi)存分配時考慮什么問題。引言對于任何使用 C 語言的人,如果問他們 C 語言的最大煩惱是什么,其中許多人可能會回答說是指針和內(nèi)存泄漏。這些的確是消耗了開發(fā)人員大多數(shù)調(diào)試時間的事項。指針和內(nèi)存泄漏對某些開發(fā)人員來說似乎令人畏懼,但是一旦您了解了指針及其關聯(lián)內(nèi)存操作的基礎,它們就是您在 C 語言中擁有的最強大工具。本文將與您分享開發(fā)人員在開始使用指針來編程前應該知道的秘密。本文內(nèi)容包括:導致內(nèi)存破壞的指針
2、操作類型在使用動態(tài)內(nèi)存分配時必須考慮的檢查點導致內(nèi)存泄漏的場景如果您預先知道什么地方可能出錯,那么您就能夠小心避免陷阱,并消除大多數(shù)與指針和內(nèi)存相關的問題。 什么地方可能出錯?有幾種問題場景可能會出現(xiàn),從而可能在完成生成后導致問題。在處理指針時,您可以使用本文中的信息來避免許多問題。未初始化的內(nèi)存在本例中,p 已被分配了 10 個字節(jié)。這 10 個字節(jié)可能包含垃圾數(shù)據(jù),如圖 1 所示。char *p = malloc ( 10 ;圖 1. 垃圾數(shù)據(jù)如果在對這個 p 賦值前,某個代碼段嘗試訪問它,則可能會獲得垃圾值,您的程序可能具有不可預測的行為。p 可能具有您的程序從未曾預料到的值。良好的實踐
3、是始終結合使用 memset 和 malloc,或者使用 calloc。char *p = malloc (10;memset(p,0,10;現(xiàn)在,即使同一個代碼段嘗試在對 p 賦值前訪問它,該代碼段也能正確處理 Null 值(在理想情況下應具有的值),然后將具有正確的行為。內(nèi)存覆蓋由于 p 已被分配了 10 個字節(jié),如果某個代碼片段嘗試向 p 寫入一個 11 字節(jié)的值,則該操作將在不告訴您的情況下自動從其他某個位置“吃掉”一個字節(jié)。讓我們假設指針 q 表示該內(nèi)存。圖 2. 原始 q 內(nèi)容圖 3. 覆蓋后的 q 內(nèi)容結果,指針 q 將具有從未預料到的內(nèi)容。即使您的模塊編碼得足夠好,也可能由于某
4、個共存模塊執(zhí)行某些內(nèi)存操作而具有不正確的行為。下面的示例代碼片段也可以說明這種場景。char *name = (char * malloc(11; / Assign some value to namememcpy ( p,name,11; / Problem begins here在本例中,memcpy 操作嘗試將 11 個字節(jié)寫到 p,而后者僅被分配了 10 個字節(jié)。作為良好的實踐,每當向指針寫入值時,都要確保對可用字節(jié)數(shù)和所寫入的字節(jié)數(shù)進行交叉核對。一般情況下,memcpy 函數(shù)將是用于此目的的檢查點。內(nèi)存讀取越界內(nèi)存讀取越界 (overread 是指所讀取的字節(jié)數(shù)多于它們應有的字節(jié)數(shù)。
5、這個問題并不太嚴重,在此就不再詳述了。下面的代碼提供了一個示例。char *ptr = (char *malloc(10;char name20 ;memcpy ( name,ptr,20; / Problem begins here在本例中,memcpy 操作嘗試從 ptr 讀取 20 個字節(jié),但是后者僅被分配了 10 個字節(jié)。這還會導致不希望的輸出。內(nèi)存泄漏內(nèi)存泄漏可能真正令人討厭。下面的列表描述了一些導致內(nèi)存泄漏的場景。重新賦值 我將使用一個示例來說明重新賦值問題。char *memoryArea = malloc(10;char *newArea = malloc(10;這向如下面的圖
6、 4 所示的內(nèi)存位置賦值。圖 4. 內(nèi)存位置memoryArea 和 newArea 分別被分配了 10 個字節(jié),它們各自的內(nèi)容如圖 4 所示。如果某人執(zhí)行如下所示的語句(指針重新賦值)memoryArea = newArea; 則它肯定會在該模塊開發(fā)的后續(xù)階段給您帶來麻煩。 在上面的代碼語句中,開發(fā)人員將 memoryArea 指針賦值給 newArea 指針。結果,memoryArea 以前所指向的內(nèi)存位置變成了孤立的,如下面的圖 5 所示。它無法釋放,因為沒有指向該位置的引用。這會導致 10 個字節(jié)的內(nèi)存泄漏。圖 5. 內(nèi)存泄漏在對指針賦值前,請確保內(nèi)存位置不會變?yōu)楣铝⒌摹J紫柔尫鸥笁K
7、假設有一個指針 memoryArea,它指向一個 10 字節(jié)的內(nèi)存位置。該內(nèi)存位置的第三個字節(jié)又指向某個動態(tài)分配的 10 字節(jié)的內(nèi)存位置,如圖 6 所示。圖 6. 動態(tài)分配的內(nèi)存free(memoryArea如果通過調(diào)用 free 來釋放了 memoryArea,則 newArea 指針也會因此而變得無效。newArea 以前所指向的內(nèi)存位置無法釋放,因為已經(jīng)沒有指向該位置的指針。換句話說,newArea 所指向的內(nèi)存位置變?yōu)榱斯铝⒌?,從而導致了?nèi)存泄漏。每當釋放結構化的元素,而該元素又包含指向動態(tài)分配的內(nèi)存位置的指針時,應首先遍歷子內(nèi)存位置(在此例中為 newArea),并從那里開始釋放,然
8、后再遍歷回父節(jié)點。這里的正確實現(xiàn)應該為:free( memoryArea->newArea;free(memoryArea;返回值的不正確處理 有時,某些函數(shù)會返回對動態(tài)分配的內(nèi)存的引用。跟蹤該內(nèi)存位置并正確地處理它就成為了 calling 函數(shù)的職責。char *func ( return malloc(20; / make sure to memset this location to 0void callingFunc ( func ( ; / Problem lies here在上面的示例中,callingFunc( 函數(shù)中對 func( 函數(shù)的調(diào)用未處理該內(nèi)存位置的返回地址。結
9、果,func( 函數(shù)所分配的 20 個字節(jié)的塊就丟失了,并導致了內(nèi)存泄漏。歸還您所獲得的在開發(fā)組件時,可能存在大量的動態(tài)內(nèi)存分配。您可能會忘了跟蹤所有指針(指向這些內(nèi)存位置),并且某些內(nèi)存段沒有釋放,還保持分配給該程序。始終要跟蹤所有內(nèi)存分配,并在任何適當?shù)臅r候釋放它們。事實上,可以開發(fā)某種機制來跟蹤這些分配,比如在鏈表節(jié)點本身中保留一個計數(shù)器(但您還必須考慮該機制的額外開銷)。訪問空指針訪問空指針是非常危險的,因為它可能使您的程序崩潰。始終要確保您不是 在訪問空指針??偨Y本文討論了幾種在使用動態(tài)內(nèi)存分配時可以避免的陷阱。要避免內(nèi)存相關的問題,良好的實踐是:始終結合使用 memset 和 malloc,或始終使用 calloc。每當向指針寫入值時,都要確保對可用字節(jié)數(shù)和所寫入的字節(jié)數(shù)進行交叉核對。在對指針
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高危兒健康教育
- 外科腫瘤護理評估
- 老年拐杖椅子設計
- 輸液治療的信息化管理
- 小學心理健康課程體系構建
- 2025年涂膠紡織物、帶項目申請報告
- 2025年航天器及其運載工具、零件項目提案報告
- 【白城】2025年吉林白城洮南市事業(yè)單位面向春季應征入伍畢業(yè)生招聘11人筆試歷年典型考題及考點剖析附帶答案詳解
- 【博爾塔拉】2025年新疆博爾塔拉職業(yè)技術學院招聘專任教師147人筆試歷年典型考題及考點剖析附帶答案詳解
- 音素的教學課件
- 養(yǎng)老護理員四級理論試題及答案
- 脊柱內(nèi)鏡技術
- 采購詢價單模板
- 心理測量課件-常見量表介紹與應用
- 軍人申請病退評殘醫(yī)學鑒定審查表
- 隆鼻術后護理查房
- 關于進境食用水生動物指定監(jiān)管場地名單
- 新版譯林高中英語必修一單詞表默寫版(直接打印)
- 中式面點師培訓課件
- 2023年主任醫(yī)師(正高)-中醫(yī)內(nèi)科學(正高)考試歷年真題集錦附答案
- 農(nóng)村分家協(xié)議書4篇
評論
0/150
提交評論