国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡述C語言中的內存泄漏的原理及解決方法

Q4MP_gh_c472c21 ? 來源:金橙智能 ? 作者:金橙智能 ? 2021-06-29 14:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

內存泄漏的原理

只有在堆內存里面才會發生內存泄漏的問題,在棧內存中不會發生內存泄漏。因為棧內存在自動分配空間之后,還會自動釋放空間。

什么是堆內存?存儲方式是什么樣的呢?

首先我們先來介紹一下堆內存在C代碼中的存儲方式。C代碼中動態申請堆內存的申請函數是malloc,常見的內存代碼如下圖所示:

d6d6bf80-d8a6-11eb-9e57-12bb97331649.png

因為malloc函數返回值是一個內存地址,所以保存堆內存的變量一定得是一個指針,當然這個變量可以是一個單指針,也可以是一個多重指針。

如何獲取堆內存?

對于堆內存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內存指針,第二種方法是通過參數傳遞給內存指針。上面我們用到的malloc申請內存,就是屬于方法一的一種具體表現形式,是直接把返回值傳遞給內存指針。

方法一:把函數返回值直接賦值給指針,一般表現形式如下:

d6e7fce6-d8a6-11eb-9e57-12bb97331649.png

方法二:將指針地址作為函數返回參數,通過返回參數保存堆內存地址,一般表現形式如下:

d6f30ea6-d8a6-11eb-9e57-12bb97331649.png

總結:這兩類方法的本質是一樣的,都是函數內存間接申請了內存,但是只有傳遞內存的方法不一樣,方法一是通過返回值傳遞內存指針,方法二是通過參數傳遞內存指針。

內存泄漏的三個原因

當我們的代碼出現內存泄漏的時候,一般都會包含以下幾個原因:1、函數內有局部指針變量定義;2、對該局部指針有獲取內存的操作;3、在函數返回前沒有釋放該內存,也未保存到其他全局變量或返回上一級函數。

如何檢查內存泄漏

為了避免檢查內存泄漏,我們還是要養成良好的編碼習慣。當我們要進行檢查內存泄漏問題的時候,一般要做到以下三點:

(1)當我們在函數中看到有局部指針的時候,一定要仔細檢查是否有存泄漏的問題發生,養成仔細檢查的習慣;

(2)如果有局部變量,并且有對局部變量賦值的操作,要檢查函數的返回的指針到底是指向什么?是全局變量、靜態數據還是堆內存?如果代碼中有不熟悉的接口,要找到對應接口文檔或源代碼分析,保證不要出現不必要的錯誤;

(3)如果函數中有對局部指針有內存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數返回值嗎?如果都不是的話,那要排查函數所有的“return”的地方,要保證內存被正確釋放,不占用內存。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67499
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73954
  • C代碼
    +關注

    關注

    1

    文章

    90

    瀏覽量

    15182

原文標題:一篇文章幫你解決C語言中的內存泄漏問題

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C編譯器錯誤與解決方法

    C語言keil編譯器提示錯誤的解決方法,可以幫你解決程序編譯中的煩惱!! C編譯器錯誤與解決方法 1. Warning 280:’i’:
    發表于 01-22 08:03

    c語言中的代碼優化

    。 第三招:數學方法解決問題   如今咱們演繹高效C語言編寫的第二招--采用數學方法來解決問題。數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,因此在編寫程序的時候,采
    發表于 01-12 09:45

    C語言嵌入式系統編程注意事項-內存操作

    字節為單位編址,而C語言指針以指向的數據類型長度作自增和自減。理解這一點對于以指針直接操作內存是相當重要的。 函數指針 首先要理解以下三個問題: (1)C
    發表于 01-04 07:31

    請問C語言中整形溢出的解決方法有哪些?

    C語言中整形溢出的解決方法有哪些?
    發表于 12-29 07:33

    單片機c語言中定義字節怎么定義?

    定義位可以用***it但是定義字節呢?還有就是比如匯編中的DPTR的DPH和DPL在c語言中怎樣定義的呢?
    發表于 12-29 06:32

    請問C語言中整形溢出會產生哪些異常行為?

    C語言中整形溢出會產生哪些異常行為?
    發表于 12-26 07:05

    嵌入式C語言中各變量存儲位置

    C語言的程序中,對變量的使用還有以下幾點需要注意 1. 體中定義的變量通常是在棧上,不需要在程序中進行管理,由編繹器處理。 2. 用malloc,calloc,realloc等分配內存的函數
    發表于 12-25 07:54

    請問C語言中整形溢出對哪些應用場景影響較大?

    C語言中整形溢出對哪些應用場景影響較大
    發表于 12-24 08:24

    Typedef在C語言中的應用

    Typedef 在C語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    發表于 12-22 13:53

    C語言中可以嵌套匯編語言嗎?

    請問C語言中可以嵌套匯編語言嗎?
    發表于 12-15 08:14

    Windows環境下32位匯編語言中文資料

    電子發燒友網站提供《Windows環境下32位匯編語言中文資料.rar》資料免費下載
    發表于 06-30 15:14 ?0次下載

    在OpenVINO? C++代碼中啟用 AddressSanitizer 時的內存泄漏怎么解決?

    在 OpenVINO? C++代碼中啟用 AddressSanitizer 時遇到內存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    發表于 06-23 07:16

    深入理解C語言C語言循環控制

    改變程序的執行流程,使代碼更加靈活和可控。本文將詳細介紹這些語句的作用及其應用場景,并通過示例代碼進行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發表于 04-29 18:49 ?2034次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環控制

    C語言中結構體與聯合體的深度解析:內存布局與應用場景

    一、基礎概念與核心差異 1.1 結構體(Struct)的本質 **結構體是C語言中實現數據封裝的基石,其核心特征在于內存獨立性。每個成員變量在內存中按聲明順序依次排列,形成連續的
    發表于 04-08 09:18

    快速搞懂C語言程序內存分區!

    到動態分配的數據等內容。(內存分區圖示)理解這些內存分區的結構和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如段錯誤、內存泄漏、棧溢出等常見問題。以下是常見的六
    的頭像 發表于 03-14 17:37 ?1565次閱讀
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序<b class='flag-5'>內存</b>分區!