**c語言動態記憶體管理**
c中關於動態記憶體的標準庫函式:malloc() ,calloc() ,realloc(),free()
以下是關於這幾個函式的介紹:
1、malloc(),用於動態開闢記憶體(堆空間),返回型別為void *,引數(size_t size)是無符號整型表示要開闢的空間大小,單位是位元組,
2、calloc(),用於動態開闢記憶體(堆空間),返回型別為void *,引數有
(size_t num, size_t size ),表示開闢num個大小為size的空間,
3、realloc(),用於修改已經分配好的記憶體塊的大小,返回型別為void ,引數(void memblock, size_t size),memblock是指向記憶體塊的指標,size表示要開闢的空間大小;如果是擴大乙個記憶體塊,並且記憶體塊能滿足要開闢的大小,則記憶體塊中原來的內容保持不變,新新增的記憶體新增在原來記憶體塊的後面,若不能滿足,則需重新開闢一塊空間,並將原來的內容拷貝到新記憶體中,詳見下圖:
若是縮小乙個記憶體塊,該記憶體塊尾部部分記憶體會被釋放,剩餘部分不變,如果memblock是空指標時,則和malloc()函式功能一樣;
malloc()和calloc()都用於開闢記憶體,那它們有何區別?
malloc()開闢空間後,未將其內容進行初始化,內容為隨機值;
calloc()開闢空間後,並將其內容初始化為0;
4、free(),用於釋放記憶體空間,返回型別為void ,引數( void* memblock)memblock是指向記憶體的指標;
*注意:這四個函式必須搭配使用,即用malloc()、realloc()、calloc()時必須使用free(),這樣可以避免記憶體洩漏甚至崩潰的問題。*
**c++動態記憶體管理**
c++動態記憶體管理的實現,是使用new,delect操作符來實現的:
例如:int *p1=new (int)//表示開闢乙個整型的空間,在堆上開闢;
int *p2=new[10] (int)//表示開闢10個整型的空間;
delete p1;
deletep2;
注意:new與delect\new與delete需搭配使用;
malloc/free和new/delete的區別和聯絡?
它們都是動態管理記憶體的⼊口;
malloc/free是c/c++標準庫的函式,new/delete是c++操作符;
malloc/free只是動態分配記憶體空間/釋放空間。⽽new/delete除了分配空間還會調⽤建構函式和析構函式進⾏初始化與清理(清理成員)。
malloc/free需要⼿動計算型別⼤⼩且返回值會void*,new/delete可⾃⼰計算型別的⼤⼩,返回對應型別的指標。
由此可以看出c++中的new、delete更加的高效,更適用與c++,在例項化過程中更加適用;
new、delete的實現:
可以看到new的底層實現是通過 operator new()函式實現的;函式內部呼叫了malloc()函式開闢空間;即opertaor new()是對malloc的封裝;
通過除錯可以看出delete在實現時呼叫了operator delect(),它是對free()函式的封裝;
總結:
1. operator new/operator delete operator new/operator delete 和 malloc/free⽤法⼀樣。
2 它們只負責分配空間/釋放空間,不會調⽤物件建構函式/析構函式來初始化/清理物件。
3.實際operator new和operator delete只是malloc和free的⼀層封裝。
注意:operator new(),operator delete(),不是運算子的過載,它們是c++中的標準庫函式。
new的功能有:
1. 調⽤operator new分配空間。
2. 調⽤建構函式初始化物件。
delete的功能:
1. 調⽤析構函式清理物件
2. 調⽤operator delete釋放空間
new[n]的功能:
1. 調⽤operator new分配空間。
2. 調⽤n次建構函式分別初始化每個物件。
delete的功能:
1. 調⽤n次析構函式清理物件。
2. 調⽤operator delete釋放空間。
通常用delete時沒有給出次數,那編譯器是如何知道,要呼叫析構函式的次數呢?
#define _crt_secure_no_warnings 1
#include
#include
using
namespace
std;
class a
~a()
void display()
;int main()
除錯後發現:
可以發現:operator(size_t cd),cd=16,即建立了16個位元組的空間;
但開闢 3個a類物件只需12個位元組,那為何會多出4 個位元組呢?
經測試:
由此可知,多出來的4個位元組是用來存放要開闢的物件個數的;
注意:只有當為非內建型別(類的物件等)開闢空間,並且該類有自定義的析構函式時,才會有多出的4個位元組!
以上對new和delete的說明,可以模擬實現new的功能,在實現之前先介紹,定位new表示式;
定位new表示式:是在已分配的原始記憶體空間中調⽤建構函式初始化⼀個物件。
用法如下:
new (place_address) type
new (place_address) type(initializer-list)
place_address必須是⼀個指標,initializer-list是型別的初始化列表。
模擬實現new操作符,**如下:
#define new(p,count,type)\
\
}
模擬實現delete:
delect(p)
free((int *)p-1);
}
C 動態記憶體管理
我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...
C 動態記憶體管理
1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...
c 動態記憶體管理
c語言動態記憶體管理 c語言使用malloc calloc realloc free進行動態記憶體管理 malloc是不初始化的開闢空間,其引數為空間的大小,單位為位元組 calloc是初始化的進行開闢空間,其引數為 元素個數,大小 單位為位元組。realloc增容,如果後面的空間足夠的話,就直接追...