c++中new和delete(運算符)和C中的malloc和free(函數)的使用方法


new和delete是運算符,不是函數,不須要頭文件,用於動態分配和撤銷內存的運算符 程序員

new用法: 編程

          1.     開闢單變量地址空間 數組

               1)new int;  //開闢一個存放數組的存儲空間,返回一個指向該存儲空間的地址.int *a = new int 即爲將一個int類型的地址賦值給整型指針a.  數據結構

               2)int *a = new int(5) 做用同上,可是同時將整數賦值爲5 函數

          2.     開闢數組空間 spa

               一維: int *a = new int[100];開闢一個大小爲100的整型數組空間 操作系統

               二維: int **a = new int[5][6] 線程

               三維及其以上:依此類推. 指針

         通常用法: new 類型 [初值] code

delete用法:

          1. int *a = new int;

               delete a;   //釋放單個int的空間

          2.int *a = new int[5];

               delete [] a; //釋放int數組空間

 

          要訪問new所開闢的結構體空間,沒法直接經過變量名進行,只能經過賦值的指針進行訪問.

          用new和delete能夠動態開闢,撤銷地址空間.在編程序時,若用完一個變量(通常是暫時存儲的數組),下次須要再用,但卻又想省去從新初始化的功夫,能夠在每次開始使用時開闢一個空間,在用完後撤銷它.

1、malloc()和free()的基本概念以及基本用法:

一、函數原型及說明:

頭文件:在TC2.0中能夠用malloc.h或 alloc.h (注意:alloc.h 與 malloc.h 的內容是徹底一致的),而在Visual C++6.0中能夠用malloc.h或者stdlib.h
void *malloc(long NumBytes):該函數分配了NumBytes個字節,並返回了指向這塊內存的指針(void* 表示未定義指針類型)。若是分配失敗,則返回一個空指針(NULL)。
關於分配失敗的緣由,應該有多種,好比說空間不足就是一種。
void free(void *FirstByte): 該函數是將以前用malloc分配的空間還給程序或者是操做系統,也就
是釋放了這塊內存,讓它從新獲得自由。

二、函數用法

程序代碼:
         // Code... 
         char *Ptr = NULL; 
         Ptr = (char *)malloc(100 * sizeof(char)); 
         if (NULL == Ptr) 
     { 
         exit (1); 
     } 
         gets(Ptr); 
         // code... 
         free(Ptr); 
         Ptr = NULL; 
         // code...
一、malloc()到底從哪裏獲得了內存空間?答案是從堆裏面得到空間。也就是說函數返回的指針是指向
堆裏面的一塊內存。操做系統中有一個記錄空閒內存地址的鏈表。當操做系統收到程序的申請時,就會
遍歷該鏈表,而後就尋找第一個空間大於所申請空間的堆結點,而後就將該結點從空閒結點鏈表中刪除
,並將該結點的空間分配給程序。就是這樣!

二、什麼是堆:堆是你們共有的空間,分全局堆和局部堆。全局堆就是全部沒有分配的空間,局部堆就
是用戶分配的空間。堆在操做系統對進程初始化的時候分配,運行過程當中也能夠向系統要額外的堆,
可是記得用完了要還給操做系統,要否則就是內存泄漏。
三、什麼是棧:棧是線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每
個線程的棧互相獨立。每一個函數都有本身的棧,棧被用來在函數之間傳遞參數。操做系統在切換線程的
時候會自動的切換棧,就是切換SS/ESP寄存器棧空間不須要在高級語言裏面顯式的分配和釋放

總之,棧是由編譯器自動分配釋放,存放函數的參數值、局部變量的值等。操做方式相似於數據結構中的
棧。堆通常由程序員分配釋放,若不釋放,程序結束時可能由OS回收,可是這的堆與操做系統的堆是兩回事,它的操做相似鏈表。

相關文章
相關標籤/搜索