轉:C++動態記憶體建立與記憶體管理學習筆記[2]

來源:互聯網
上載者:User
 2 C中記憶體配置

A malloc 原型為void* malloc(size_t size);在記憶體中的動態儲存裝置區中分配一個長度為size的空間,返回指向大小為size的記憶體地區首地址的void指標;使用者必須決定對象的長度,即申請空間的大小。同時,malloc只是分配了一塊傳回值為void*的記憶體而不是產生一個對象。由於malloc傳回值的類型是void*,所以在調用malloc時要顯式地進行類型轉換,將void* 轉換成所需要的指標類型,malloc函數本身並不識別要申請的記憶體是什麼類型,它只關心記憶體的總位元組數,因此使用sizeof是很好的方式,例如:int* p = (int*) malloc(sizeof(int) * length);使用malloc所分配的是一塊連續的記憶體,同時由於編譯器的實現問題(比如邊界對齊等),其所分配的記憶體可能比所請求的多一點。如果記憶體池為空白,或者可用記憶體不能滿足所請求的記憶體,則編譯器向作業系統請求,要求得到更多的記憶體,並在所得到的記憶體上執行分配任務。若作業系統無法向malloc提供更多的記憶體,那麼malloc返回一個NULL指標,因此有必要對malloc的返回指標進行檢查。 B realloc 原型為void realloc(void* ptr, size_t sz);用於修改一個原先已經分配記憶體塊的大小,可以擴大也可以縮小。若擴大時,則保留原先的記憶體,將新添加的記憶體放於原先記憶體塊的後面,新記憶體並未以任何方式進行初始化;若縮小時,該記憶體塊尾部的部分記憶體釋放,其餘部分保留。注意:若realloc的第一個參數為NULL,那麼其行為與malloc一樣。另外如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複寫到新塊上,因此在使用realloc之後就不能再使用指向原記憶體的指標,而應該改用realloc所返回的新指標。 C calloc 原型為void* calloc(size_t elem_num, size_t elem_sz);與malloc的主要區別在於calloc在返回指向記憶體的指標之前把它初始化為0,另一個區別是他們請求記憶體數量的方式不通,calloc的參數包括所需元素的數量和每個元素的位元組數,由此它能夠計算出總共需要分配的記憶體。 D free 原型為void free( void* p ); 由於指標p的類型以及它所指的記憶體的容量事先都是知道的,因此語句free(p)能正確地釋放記憶體。如果p是NULL指標,那麼free對p無論操作多少次都不會出問題。如果p不是NULL指標,那麼free對p連續操作兩次就會導致未定義的結果。

示範樣本:(需要寫出具有代表性的樣本) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.