c 動態記憶體分配

2021-08-28 06:06:57 字數 1516 閱讀 5555

c語言的動態記憶體申請malloc,calloc,realloc的不同記憶體洩漏?如何避免?怎麼檢測?如何檢測記憶體是否洩漏?

int*p = (int*)malloc(sizeof(int));  //既要強轉,又要手動計算大小if(null==p) ,還要判空
但c++中則沒有上述存在的問題

new/delete是操作符,它們的原型函式 :

new/delete的函式:

申請空間和釋放空間要對應使用

申請空間:

int* p1 = new int   //申請乙個整型空間

int* p2 = new int(10) //對申請的單個空間初始化

int* p3 = new int [10] //申請一段連續的空間

釋放空間:

delete  p1;

delete p2;

delete p3; //對應釋放

申請釋放一定要對應匹配使用,malloc用free釋放,new用delete釋放,new用delete釋放否則會造成記憶體洩漏或程式崩潰原因如下:new和delete的底層實現new:申請空間,呼叫建構函式

delete:釋放空間,呼叫析構函式

現在有乙個time類,用malloc申請空間:time t1 =(time)malloc(sizeof(time));

實際上,malloc在底層實現時並沒有呼叫類的建構函式*,所以此時申請出來的並不是乙個類,只是大小和它類相同記憶體塊。如果不匹配使用,例如用delete釋放,delete在底層釋放空間時會呼叫析構函式,此時都沒有空間,再去釋放,程式必然出問題。但是用new申請空間時會呼叫建構函式。new則會呼叫建構函式,給類放置資源,delete會呼叫析構函式,清理類中資源。但是malloc不呼叫建構函式,free也不會不呼叫析構函式,如果用free釋放new申請出來的空間,free不會呼叫析構函式,那麼此時就會造成資源洩漏。

**new /delete底層實現 **

new 型別[n]----------申請空間,多申請4個位元組,呼叫n次建構函式

delete x---------銷毀物件,從多申請的4位元組中取數呼叫析構函式?

如下圖:

由上圖可知new和delete是malloc和free的一層分裝,所以的對應匹配使用,不能用free釋放new出來的東西。

new和malloc的區別

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

c 動態記憶體分配

c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...

C 動態記憶體分配

c 動態記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確...