C 學習筆記 C 中的new

2021-07-11 19:41:34 字數 1475 閱讀 9429

在c語言中我們學習過動態記憶體分配一共有這麼幾個操作:

malloc

free

realloc

alloc

1.malloc最常見,申請指定大小的記憶體,如果成功則返回申請記憶體的首位址,如果失敗返回null。

2.free操作釋放由malloc、realloc和alloc申請的記憶體,其實就是釋放在堆中申請的記憶體。

3.realloc是在堆上重新申請指定大小的記憶體,它需要傳入已經在堆上申請的記憶體的首位址以及指定再次申請的記憶體的大小。

4.alloc申請指定大小和塊數的記憶體,並且把這片區域初始化為0。

在c++中上述的操作依然適用,但是我們還可以採用如下的一對操作:

new

delete

new的操作比malloc要靈活的多,它不僅可以在堆上進行申請,還可以在靜態區域進行申請。關於new的內容我們需要了解以下幾個方面:

1.使用new運算子申請記憶體;

//使用new申請單個變數和申請變數陣列

int *p_int = new

int (6); //申請乙個int並且設定值為6

int *p_array = new

int[10]; //申請了10個int的陣列

當new申請失敗時會怎樣?返回乙個null麼,以前是這樣,現在的標準中如果new失敗則會引發乙個異常std::bad_alloc

2.new:運算子、函式和替換函式

new和delete的生命如下:

void * operator

new(std::size_t);

void * operator

new(std::size_t);

void

operator

delete(void *);

void

operator

delete(void *);

如果你擁有足夠的知識和特殊需求, 可以為new和delete提供替換函式。只需要做運算子過載即可

3.定位new運算子

這是new不同於malloc的用法, new可以定位要申請記憶體的位置(不一定在堆上),它可以讓你在特定的位置建立物件。要想使用new的特殊用法,需要包含標頭檔案new。例項如下:

//定位new運算子

#include

char buffer1[1000] = ;

int main(int argc, char **argv)

記住這要申請的記憶體是不能通過delete釋放的(因為不在堆上申請)。此時p_int和buffer1的值是相同的。但是他們的型別不同

定位new雲算符的另外一種用法是將資訊放在特定的硬體位址處。

C 學習筆記3 new

c 學習過程中經常會碰到一些關於元素的插入與刪除。就容器而言,在容器物件中insert或者壓入乙個元素時,該物件大小會增加1。在分析容器與陣列區別的時候,提出了,陣列的大小是指定的,而容器的大小動態的。當時我也思考到,new和delete也是動態的建立陣列的,這又該怎麼解釋呢?於是我把教材中關於ne...

C 學習筆記 new失敗後的處理

眾所周知,c 中使用new關鍵字申請記憶體成功時會返回申請的記憶體起始位址,並在該位址上呼叫建構函式。那麼,有考慮過失敗的情況嗎?int p int malloc 10000000000000000000 if null p else int p new 10000000000000000000 i...

c 中new的用法

c 中,new的用法很靈活,這裡進行了簡單的總結 x5 t d s v v9 n w j 1.new 分配這種型別的乙個大小的記憶體空間,並以括號中的值來初始化這個變數 u t,v u 2.new 分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數 8 a6 r i 6 g m l...