亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言中的內(nèi)存泄露 怎樣避免與檢測

 更新時間:2013年09月09日 10:07:39   作者:  
堆經(jīng)常會出現(xiàn)兩種類型的問題:1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。這是最難被調(diào)試發(fā)現(xiàn)的問題之一

有些程序并不需要管理它們的動態(tài)內(nèi)存的使用。當需要內(nèi)存時,它們簡單地通過分配來獲得,從來不用擔心如何釋放它。這類程序包括編譯器和其他一些運行一段固定的(或有限的)時間然后終止的程序。當這種類型的程序終止時,所有內(nèi)存會被自動回收。細心查驗每塊內(nèi)存是否需要回收純屬浪費時間,因為它們不會再被使用。

其他程序的生存時間要長一點。有些工具如日歷管理器、郵件工具以及操作系統(tǒng)本事經(jīng)常需要數(shù)日及至數(shù)周連續(xù)運行,并需要管理動態(tài)內(nèi)存的分配和回收。由于C語言通常并不使用垃圾回收器(自動確認并回收不再使用的內(nèi)存塊),這些C程序在使用malloc()和free()時不得不非常慎重。

堆經(jīng)常會出現(xiàn)兩種類型的問題:
1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。
2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。

這是最難被調(diào)試發(fā)現(xiàn)的問題之一。如果每次已分配的內(nèi)存塊不再使用而程序并不釋放它們,進程就會一邊分配越來越多的內(nèi)存,一邊卻并不釋放不再使用的那部分內(nèi)存。

避免內(nèi)存泄露
每當調(diào)用malloc分配內(nèi)存時,注意在以后要調(diào)用相應(yīng)的free來釋放它。

如果不知道如何調(diào)用free與先前的malloc相對應(yīng),那么很可能已經(jīng)造成了內(nèi)存泄露!

一種簡單的方法就是在可能的時候使用alloca()來分配動態(tài)內(nèi)存,以避免上述情況。當離開調(diào)用alloca的函數(shù)時,它所分配的內(nèi)存會被自動釋放。

顯然,這并不適用于那些比創(chuàng)建它們的函數(shù)生命期更長的結(jié)構(gòu)。但如果對象的生命期在該函數(shù)結(jié)束前便已經(jīng)終止,這種建立在堆棧上的動態(tài)內(nèi)存分配是一種開銷很小的選擇。有些人不提倡使用alloca,因為它并不是以后總可移植的方法。如果處理器在硬件上不支持堆棧,alloca()就很難高效地實現(xiàn)。

我們使用“內(nèi)存泄露”這個詞是因為一種稀有的資源正在被一個進程榨干。內(nèi)存泄露的主要可見癥狀就是罪魁進程的速度很減慢。原因是體積大的進程更有可能被系統(tǒng)換出,讓別的進程運行,而且大的進程在換進換出時花費的時間也更多。即使泄露的內(nèi)存本省并不被引用,但它仍用可能存在于頁面中(內(nèi)容自然是垃圾),這樣就增加了進程的工作頁數(shù)量,降低了性能。另外需要注意的一點是,內(nèi)存泄露往往比忘記釋放的的數(shù)據(jù)結(jié)構(gòu)要打,因為malloc()所分配的內(nèi)存通常會圓整為下一個大于申請數(shù)量的2的整數(shù)次方(如申請212B,會圓整為256B)。在資源有限的情況下,即使引起內(nèi)存泄露的進程并不運行,整個系統(tǒng)運行速度也會被拖慢。從理論上說,進程的大小有一個上限值,這在不同的操作系統(tǒng)中各不相同。在當前的SunOS版本中,進程的最大地址空間可以多達4GB。事實上,在進程所泄露的內(nèi)存遠未達到這個數(shù)量時,磁盤的交換區(qū)早已消耗殆盡。

如何檢測內(nèi)存泄露
觀察內(nèi)存泄露是一個兩步驟的過程。首先,使用swap命令觀察還有多少可用的交換空間:

/usr/sbin/swap -s
total:17228K bytes allocated + 5396K reserved=22626K used,29548K available.

在一兩分鐘內(nèi)鍵入該命令三到四次,看看可用的交換區(qū)是否在減少。還可以使用其他一些/usr/bin/*stat工具如netstat、vmstat等。如發(fā)現(xiàn)波段有內(nèi)存被分配且從不釋放,一個可能的解釋就是有個進程出現(xiàn)了內(nèi)存泄露。

相關(guān)文章

  • C語言實現(xiàn)自行車管理系統(tǒng)

    C語言實現(xiàn)自行車管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)自行車管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ 實現(xiàn)高性能HTTP客戶端

    C++ 實現(xiàn)高性能HTTP客戶端

    HttpClient可以實現(xiàn)所有HTTP的方法,通過API傳輸接收HTTP消息。本文詳細講解了HttpClient,以及如何運用C++實現(xiàn)HTTP客戶端,感興趣的朋友可以參考一下
    2021-08-08
  • C++中的static和const的關(guān)鍵字用法詳解

    C++中的static和const的關(guān)鍵字用法詳解

    這篇文章主要介紹了C++中的static和const的關(guān)鍵字用法詳解,這是一道經(jīng)常在面試中被問到的知識,本文給大家詳細介紹下,需要的朋友可以參考下
    2023-06-06
  • 深入解析C++中的mutable關(guān)鍵字

    深入解析C++中的mutable關(guān)鍵字

    在C++中,mutable也是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠處于可變的狀態(tài),即使在一個const函數(shù)中
    2013-10-10
  • C++?Boost?StringAlgorithms超詳細講解

    C++?Boost?StringAlgorithms超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)

    C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)

    這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Matlab實現(xiàn)別踩白塊小游戲的示例代碼

    Matlab實現(xiàn)別踩白塊小游戲的示例代碼

    別踩白塊是一款音樂類休閑游戲,游戲的玩法不難,只需跟著音樂的節(jié)奏點中對的方塊即可。本文將用Matlab實現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下
    2022-03-03
  • C/C++ 中g(shù)cc和g++的對比與區(qū)別

    C/C++ 中g(shù)cc和g++的對比與區(qū)別

    這篇文章主要介紹了C/C++ 中g(shù)cc和g++的對比與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++實現(xiàn)的大數(shù)相乘算法示例

    C++實現(xiàn)的大數(shù)相乘算法示例

    這篇文章主要介紹了C++實現(xiàn)的大數(shù)相乘算法,結(jié)合實例形式分析了C++大數(shù)相乘的概念、原理及代碼實現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 二叉搜索樹源碼分享

    二叉搜索樹源碼分享

    這篇文章主要介紹了二叉搜索樹源碼,需要的朋友可以參考下
    2014-04-04

最新評論