C 中new的三種使用方法說明

2021-09-12 18:36:19 字數 2449 閱讀 6211

一、概念

在c++中new的三種用法包括:plain new, nothrow new 和 placement new。

plain new就是我們最常使用的new的方式,在c++中的定義如下:

1 void* operator new(std::size_t) throw(std::bad_alloc);  

2 void operator delete( void *) throw();

plain new在分配失敗的情況下,丟擲異常std::bad_alloc而不是返回null,因此通過判斷返回值是否為null是徒勞的。

nothrow new是不丟擲異常的運算子new的形式。nothrow new在失敗時,返回null。定義如下:

1 void * operator new(std::size_t, const std::nothrow_t&) throw();

2 void operator delete(void*) throw();

placement new意即「放置」,這種new允許在一塊已經分配成功的記憶體上重新構造物件或物件陣列。placement new不用擔心記憶體分配失敗,因為它根本不分配記憶體,它做的唯一一件事情就是呼叫物件的建構函式。定義如下:

1 void* operator new(size_t, void*);

2 void operator delete(void*, void*);

palcement new 的主要用途就是反覆使用一塊較大的動態分配的記憶體來構造不同型別的物件或者他們的陣列。placement new構造起來的物件或其陣列,要顯示的呼叫他們的析構函式來銷毀,千萬不要使用delete。

二、示例

plain new

char *getmemory(unsigned long size)   

void main(void)

catch(const std::bad_alloc & ex)

}

nowthrow new

void func(unsinged long length)   

placement new

void main()   

// ...

long * q = new (p) long(1000);

delete p; // 只釋放 p,不要用q釋放。

}

p和q僅僅是首址相同,所構建的物件可以型別不同。所「放置」的空間應小於原空間,以防不測。當」放置new」超過了申請的範圍,debug版下會掛機,但release版竟然能執行而不出錯!

該運算子的作用是:只要第一次分配成功,不再擔心分配失敗。

void main()   

long * q1 = new (p) long(100);

// 使用q1 ...

int * q2 = new (p) int[100/sizeof(int)];

// 使用q2 ...

adt * q3 = new (p) adt[100/sizeof(adt)];

// 使用q3 然後釋放物件 ...

delete p; // 只釋放空間,不再析構物件。

}

注意:使用該運算子構造的物件或陣列,一定要顯式呼叫析構函式,不可用delete代替析構,因為placement new 的物件的大小不再與原空間相同。

void main()   

// ...

adt * q = new (p) adt;

// ...

// delete q; // 錯誤

q->adt::~adt(); // 顯式呼叫析構函式,僅釋放物件

delete p; // 最後,再用原指標來釋放記憶體

}

placement new 的主要用途就是可以反覆使用一塊已申請成功的記憶體空間。這樣可以避免申請失敗的徒勞,又可以避免使用後的釋放。

特別要注意的是對於 placement new 絕不可以呼叫的delete, 因為該new只是使用別人替它申請的地方(只是個租房戶,不是房主。無權將房子賣掉)。釋放記憶體是nothrow new的事,即要使用原來的指標釋放記憶體。

C 中new的三種使用方法說明

一 概念 在c 中new的三種用法包括 plain new,nothrow new 和 placement new。plain new就是我們最常使用的new的方式,在c 中的定義如下 1 void operator new std size t throw std bad alloc 2 void...

C 中new的三種使用方法說明

一 概念 在c 中new的三種用法包括 plain new,nothrow new 和 placement new。plain new就是我們最常使用的new的方式,在c 中的定義如下 1 void operator new std size t throw std bad alloc 2 void...

總結C 中三種關於 new 的使用方法

總結c 中三種關於 new 的使用方法 雖然有三種new的 用法,但是分為兩大類也未嘗不可,那麼是哪兩類呢?其一是new operator,也叫new表示式 其二是operator new,也叫new操作符。這兩個英文名稱起的也太絕了,很容易搞混,那就記中文名稱吧。new表示式比較常見,也最常用,例...