1. 程式人生 > >new/delete和malloc/free用法與區別

new/delete和malloc/free用法與區別

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是否可以相互呼叫

  • 申請的記憶體所在位置

  • 記憶體分配失敗時的返回值

  • 是否需要指定記憶體大小

  • 對陣列的處理  

  • 客戶處理記憶體分配不足

  • 能夠直觀地重新分配記憶體