close

溫馨提示:文末有福利,送大家現代C++白皮書,限量1000份。

作為程序員,特別是C/C++程序員,內存泄漏問題是必須要邁過的一座大山,那,

寫代碼時如何避免內存泄漏?

出現內存泄漏後,如何調試?

直奔主題!

01內存

如何避免內存泄漏?

誰也不能永遠保證自己的代碼沒有內存泄漏,這裡我只能給出幾點建議:

充分利用RAII:考慮使用智能指針,關於智能指針是否應用使用,相信有人聽身邊的大佬說過不建議使用使用智能指針,可能是個帶刺的玫瑰?不過在我短暫的C++開發生涯里,我還沒有被智能指針坑過,而且用起來還特別方便,因為它真的能夠降低出現內存泄漏的概率。至於那些大佬們的不同聲音,我更傾向於Bjarne Stroustrup和Scott Meyers這些大佬們的意見,他們都建議使用智能指針,那我等小輩跟隨就完事了。

誰申請誰釋放:如果沒有使用智能指針,或者有些情況下沒辦法使用智能指針,那我們最好遵循一個原則,即誰申請誰釋放原則。A這裡申請的內存儘量在A這裡釋放,不要A申請內存,然後跑到B里釋放,這種代碼不直觀,一不利於排查問題,二很容易稍微一點疏忽就導致內存泄漏。

確保配對使用:new/delete,new[]/delete[]一定要配對使用,不配對使用大概率會出問題。這裡推薦看下new[]和delete[]一定要配對使用嗎?

小空間優先使用棧內存:一般內存泄漏都是指堆內存泄漏,我們不申請堆內存,它自然就不會泄漏。

附加:這裡還有個有效避免內存泄漏的方案,就是手擼一個內存泄漏檢測器,在Debug模式下可以考慮開啟它,程序運行一遍後,如果有內存泄漏,會精確指出是在哪裡出現的泄漏。關於內存泄漏檢測器可以移步到這裡:我擼了個內存泄漏檢測工具,只用了兩招,其實原理就是重載operator new和operator delete。

02

如何調試內存泄漏?

既然是調試,那就得用上工具,調試內存泄漏的工具有很多,最經典的就是valgrind和Asan,valgrind非常好用,但是在移動端不太好用,特別是Android,移植起來非常困難,而且還要sudo權限。而Asan就好多了,在哪裡都能用,關於Asan我之前寫文章介紹過,可以看這裡:Linux如何調試內存泄漏。

然而如果是在移動端,我還發現了一個好用的開源庫:https://github.com/tencent/matrix

這是一個騰訊出品的性能剖析工具,適用於Android和iOS,內存泄漏檢測只是功能之一,更多功能大家可以自己去看看,確實不錯。

打完收工。

送書

這本書是C++ 之 父 Bjarne Stroustrup 的 HOPL4 論文的中文版。這篇論文特別重要,因為它涵蓋了 C++98 之後的所有 C++ 版本,從 C++11 直到 C++20。這些都是C++開發者一定要掌握的知識點,所以Boolan組織了一群譯者,把這篇重要論文翻譯成了中文,讓 C++ 開發人員對 C++ 的設計原則和歷史有一個系統的了解。吳詠煒老師是主要成員呢。感興趣的可以掃碼領取,限量1000份,先到先得哈。也可以點擊閱讀原文領取。

點個在看你最好看

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()