new/delete和malloc/free用法與區別
阿新 • • 發佈:2018-12-17
1 new / delete
1.1 new/delete表示式(操作符)
表示式的使用如下:
string *sp=new string("aaaa");
string *arr=new string[10];
delete sp;
delete [] arr;
以上的new表示式(操作符)在使用時共經歷了三步:分配記憶體、構造(初始化)物件、返回指標。
以上的delete表示式(操作符)在使用時共經歷了兩步:析構物件、釋放記憶體。
1.2 operator new/operator delete [ ]函式
- operator new(或operator new[ ])函式一般只執行new操作符的第一步——分配記憶體。對operator new/delete函式的過載也能待變記憶體分配和釋放的方式,不能改變new/delete運算子的含義。
- opeartor new /operator delete可以被過載。標準庫是定義了operator new函式和operator delete函式的8個過載版本:
//這些版本可能丟擲異常 void * operatornew(size_t); void * operator new[](size_t); void * operatordelete (void * )noexcept; void * operator delete[](void *0)noexcept; //這些版本承諾不丟擲異常 void * operatornew(size_t ,nothrow_t&) noexcept; void * operator new[](size_t, nothrow_t& ); void * operatordelete (void *,nothrow_t& )noexcept; void * operator delete[](void *0,nothrow_t& )noexcept;
過載operator new 和 operator delete的一種簡單方式:
void * operator new(size_t size) //第一個形參必須是size_t,由編譯器計算
{
if(void *mem=malloc(size)) //用malloc分配空間要檢查指標
return mem; //返回 void *
else
throw bad_alloc(); //丟擲異常
}
void operator delete(void *mem) noexcept
{
free(mem);
}
- 定位new表示式允許使用者向new表示式傳遞額外的引數。
int *p=new (nothrow)int; //不丟擲異常,如果分配失敗,new返回一個空指標。
- 當只傳入一個指標型別的實參時,定位new使用operator new(size_t, void *)在傳入的地址上構建物件但是不分配記憶體。傳給定位new的指標無須指向operator new分配的記憶體,也不需要指向動態記憶體。
2.malloc / free
2.1 malloc
原型:extern void *malloc(unsigned int num_bytes);
說明:malloc的全稱是memory allocation,中文叫動態記憶體分配。分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗返回空指標NULL(0)。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
2.2 free
原型:void free(void *FirstByte);
說明:該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由
3.區別
-
是否可以被過載
-
是否呼叫建構函式/解構函式
-
new與malloc是否可以相互呼叫
-
申請的記憶體所在位置
-
記憶體分配失敗時的返回值
-
是否需要指定記憶體大小
-
對陣列的處理
-
客戶處理記憶體分配不足
-
能夠直觀地重新分配記憶體