動態記憶體分配 記憶體洩漏及檢測

2021-09-24 23:04:29 字數 2629 閱讀 6139

所謂動態記憶體分配(dynamic memory allocation)就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。

在c中,動態記憶體分配使用malloc與free來分配記憶體和釋放記憶體.用法為:

void *malloc(size_t size);

void free(void *ptr);

其中size為要申請空間的位元組數而在c++中,動態記憶體分配有新的關鍵字new與delete,但同時也相容c的malloc與free,但推薦使用new與delete.

為什麼呢?因為new與delete是運算子而malloc與free是函式,所以new與delete的執行效率要高些,而且new與delete可以初始化變數.

通過以上**及注釋與執行結果,大家應該了解了它的用法,下面是總結:

在使用new關鍵字分配變數時可以同時進行初始化,而在分配陣列時不可以.

無論是new還是malloc分配記憶體,在使用完後一定一定要釋放記憶體,否則會造成記憶體洩漏.

c++中這兩種分配記憶體的方法可以混用,即用new分配記憶體,用free釋放記憶體.

記憶體洩漏(memory leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

如何檢測記憶體洩漏呢?看以下**:

//包含標頭檔案

#define _crtdeg_map_alloc

#include

#include

#include

#include

//接管new操作符

#ifdef _debug

#ifndef dbg_new

#define dbg_new new (_normal_block,__file__,__line__)

#define new dbg_new

#endif

#endif

using

namespace std;

intmain

(void

)_crtdumpmemoryleaks()

;//輸出記憶體洩漏資訊

system

("pause");

return0;

}

執行結果:

很奇怪,對吧?什麼都沒輸出,我們來看看ide的輸出介面:

detected memory leaks!檢測到記憶體洩漏,標註了洩漏的檔案,洩漏的位元組長度,洩漏的位置.我呼叫了五次new操作符且未**,所以它報了五次記憶體洩漏.

_crtdumpmemoryleaks();的作用:當它執行時,所有未銷毀的物件均會報記憶體洩漏.所以我們最好在程式將要結束的時候使用它.

要實現檢測分三步:

1.包含標頭檔案(巨集定義是為了輸出記憶體洩漏發生在哪個檔案)

#define _crtdeg_map_alloc

#include

#include

2.接管new操作符

#ifdef _debug

#ifndef dbg_new

#define dbg_new new (_normal_block,__file__,__line__)

#define new dbg_new

#endif

#endif

3.呼叫

_crtdumpmemoryleaks()

;

以上的方法實際上是使用了crt庫,對於記憶體洩漏的檢測,其實有很多任務具,比如:mallocdebug,valgrind,kcachegrind,dmalloc,numega,boundscheck,parasoft,insure++等等,隨著**量的增長,記憶體洩漏這種問題幾乎是無法避免的,這時我們可以利用這些工具比較便捷找到問題所在.

動態記憶體洩漏

動態記憶體洩露分析 2 xcode自帶的工具 instrument中的leaks allocations工具可以幫助我們進行記憶體洩露的排查,但它們存在不足。在 arc 時代更常見的記憶體洩露是迴圈引用導致的 abandoned memory,leaks 工具查不出這類記憶體洩露,應用有限 inst...

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...