使這些格式元素成為您日常工作的一部分。可以使用各種方法解決內(nèi)存問題:
專用庫
語言
軟件工具
硬件檢查器
在這整個領域中,我始終認為最有用并且投資回報率的是考慮改進源代碼的風格。它不需要昂貴的代價或嚴格的形式;可以始終取消與內(nèi)存無關的段的注釋,但影響內(nèi)存的定義當然需要顯式注釋。添加幾個簡單的單詞可使內(nèi)存結果更清楚,并且內(nèi)存編程會得到改進。
我沒有做受控實驗來驗證此風格的效果。如果您的經(jīng)歷與我一樣,您將發(fā)現(xiàn)沒有說明資源影響的策略簡直無法忍受。這樣做很簡單,但帶來的好處太多了。
檢測
檢測是編碼標準的補充。二者各有裨益,但結合使用效果特別好。機靈的 C 或 C++ 專業(yè)人員甚至可以瀏覽不熟悉的源代碼,并以極低的成本檢測內(nèi)存問題。通過少量的實踐和適當?shù)奈谋舅阉?,您能夠快速驗證平衡的 *alloc() 和 free() 或者 new 和 delete 的源主體。人工查看此類內(nèi)容通常會出現(xiàn)像清單 7 中一樣的問題。
清單 7. 棘手的內(nèi)存泄漏
static char *important_pointer = NULL;
void f9()
{
if (!important_pointer)
important_pointer = malloc(IMPORTANT_SIZE);
...
if (condition)
/* Ooops! We just lost the reference
important_pointer already held. */
important_pointer = malloc(DIFFERENT_SIZE);
...
}
如果 condition 為真,簡單使用自動運行時工具不能檢測發(fā)生的內(nèi)存泄漏。仔細進行源分析可以從此類條件推理出證實正確的結論。我重復一下我寫的關于風格的內(nèi)容:盡管大量發(fā)布的內(nèi)存問題描述都強調(diào)工具和語言,對于我來說,的收獲來自“軟的”以開發(fā)人員為中心的流程變更。您在風格和檢測上所做的任何改進都可以幫助您理解由自動化工具產(chǎn)生的診斷。
靜態(tài)的自動語法分析
當然,并不是只有人類才能讀取源代碼。您還應使靜態(tài)語法分析 成為開發(fā)流程的一部分。靜態(tài)語法分析是 lint、嚴格編譯 和幾種商業(yè)產(chǎn)品執(zhí)行的內(nèi)容:掃描編譯器接受的源文本和目標項,但這可能是錯誤的癥狀。
希望讓您的代碼無 lint。盡管 lint 已過時,并有一定的局限性,但是,沒有使用它(或其較高級的后代)的許多程序員犯了很大的錯誤。通常情況下,您能夠編寫忽略 lint 的優(yōu)秀的專業(yè)質(zhì)量代碼,但努力這樣做的結果通常會發(fā)生重大錯誤。其中一些錯誤影響內(nèi)存的正確性。與讓客戶首先發(fā)現(xiàn)內(nèi)存錯誤的代價相比,即使對這種類別的產(chǎn)品支付最昂貴的許可費也失去了意義。清除源代碼?,F(xiàn)在,即使 lint 標記的編碼可能向您提供所需的功能,但很可能存在更簡單的方法,該方法可滿足 lint,并且比較強鍵又可移植。
專用庫
語言
軟件工具
硬件檢查器
在這整個領域中,我始終認為最有用并且投資回報率的是考慮改進源代碼的風格。它不需要昂貴的代價或嚴格的形式;可以始終取消與內(nèi)存無關的段的注釋,但影響內(nèi)存的定義當然需要顯式注釋。添加幾個簡單的單詞可使內(nèi)存結果更清楚,并且內(nèi)存編程會得到改進。
我沒有做受控實驗來驗證此風格的效果。如果您的經(jīng)歷與我一樣,您將發(fā)現(xiàn)沒有說明資源影響的策略簡直無法忍受。這樣做很簡單,但帶來的好處太多了。
檢測
檢測是編碼標準的補充。二者各有裨益,但結合使用效果特別好。機靈的 C 或 C++ 專業(yè)人員甚至可以瀏覽不熟悉的源代碼,并以極低的成本檢測內(nèi)存問題。通過少量的實踐和適當?shù)奈谋舅阉?,您能夠快速驗證平衡的 *alloc() 和 free() 或者 new 和 delete 的源主體。人工查看此類內(nèi)容通常會出現(xiàn)像清單 7 中一樣的問題。
清單 7. 棘手的內(nèi)存泄漏
static char *important_pointer = NULL;
void f9()
{
if (!important_pointer)
important_pointer = malloc(IMPORTANT_SIZE);
...
if (condition)
/* Ooops! We just lost the reference
important_pointer already held. */
important_pointer = malloc(DIFFERENT_SIZE);
...
}
如果 condition 為真,簡單使用自動運行時工具不能檢測發(fā)生的內(nèi)存泄漏。仔細進行源分析可以從此類條件推理出證實正確的結論。我重復一下我寫的關于風格的內(nèi)容:盡管大量發(fā)布的內(nèi)存問題描述都強調(diào)工具和語言,對于我來說,的收獲來自“軟的”以開發(fā)人員為中心的流程變更。您在風格和檢測上所做的任何改進都可以幫助您理解由自動化工具產(chǎn)生的診斷。
靜態(tài)的自動語法分析
當然,并不是只有人類才能讀取源代碼。您還應使靜態(tài)語法分析 成為開發(fā)流程的一部分。靜態(tài)語法分析是 lint、嚴格編譯 和幾種商業(yè)產(chǎn)品執(zhí)行的內(nèi)容:掃描編譯器接受的源文本和目標項,但這可能是錯誤的癥狀。
希望讓您的代碼無 lint。盡管 lint 已過時,并有一定的局限性,但是,沒有使用它(或其較高級的后代)的許多程序員犯了很大的錯誤。通常情況下,您能夠編寫忽略 lint 的優(yōu)秀的專業(yè)質(zhì)量代碼,但努力這樣做的結果通常會發(fā)生重大錯誤。其中一些錯誤影響內(nèi)存的正確性。與讓客戶首先發(fā)現(xiàn)內(nèi)存錯誤的代價相比,即使對這種類別的產(chǎn)品支付最昂貴的許可費也失去了意義。清除源代碼?,F(xiàn)在,即使 lint 標記的編碼可能向您提供所需的功能,但很可能存在更簡單的方法,該方法可滿足 lint,并且比較強鍵又可移植。

