文章插圖

文章插圖
本期是C++基礎語法分享的第八節,今天給大家來分享一下:
(1)內存分配和管理;
(2)malloc、free;
(3)new、delete;
(4)定位 new;
(5)delete this 合法嗎?
(6)如何定義一個只能在堆上(棧上)生成對象的類?
malloc、calloc、realloc、alloca
malloc:申請指定字節數的內存 。申請到的內存中的初始值不確定 。
calloc:為指定長度的對象,分配能容納其指定個數的內存 。申請到的內存的每一位(bit)都初始化為 0 。
realloc:更改以前分配的內存長度(增加或減少) 。當增加長度時,可能需將以前分配區的內容移到另一個足夠大的區域,而新增區域內的初始值則不確定 。
alloca:在棧上申請內存 。程序在出棧的時候,會自動釋放內存 。但是需要注意的是,alloca 不具可移植性, 而且在沒有傳統堆棧的機器上很難實現 。alloca 不宜使用在必須廣泛移植的程序中 。C99 中支持變長數組 (VLA),可以用來替代 alloca 。
malloc、free
用于分配、釋放內存
malloc、free 使用
申請內存,確認是否申請成功
char *str = (char*) malloc(100);assert(str != nullptr);釋放內存后指針置空free(p); p = nullptr;new、deletenew / new[]:完成兩件事,先底層調用 malloc 分配了內存,然后調用構造函數(創建對象) 。
delete/delete[]:也完成兩件事,先調用析構函數(清理資源),然后底層調用 free 釋放空間 。
new 在申請內存時會自動計算所需字節數,而 malloc 則需我們自己輸入申請內存空間的字節數 。
new、delete 使用
申請內存,確認是否申請成功
int main(){T* t = new T();// 先內存分配,再構造函數delete t;// 先析構函數,再內存釋放return 0;}定位 new定位 new(placement new)允許我們向 new 傳遞額外的地址參數,從而在預先指定的內存區域創建對象 。
new (place_address) typenew (place_address) type (initializers)new (place_address) type [size]new (place_address) type [size] { braced initializer list }(1)place_address 是個指針(2)initializers 提供一個(可能為空的)以逗號分隔的初始值列表
delete this 合法嗎?
合法,但:
必須保證 this 對象是通過 new(不是 new[]、不是 placement new、不是棧上、不是全局、不是其他對象成員)分配的
必須保證調用 delete this 的成員函數是最后一個調用 this 的成員函數
必須保證成員函數的 delete this 后面沒有調用 this 了
必須保證 delete this 后沒有人使用了
【c語言申請內存空間指向數組 c語言申請內存空間 程序結束】如何定義一個只能在堆上(棧上)生成對象的類?
只能在堆上
方法:將析構函數設置為私有
原因:C++ 是靜態綁定語言,編譯器管理棧上對象的生命周期,編譯器在為類對象分配棧空間時,會先檢查類的析構函數的訪問性 。若析構函數不可訪問,則不能在棧上創建對象 。
只能在棧上
方法:將 new 和 delete 重載為私有
原因:在堆上生成對象,使用 new 關鍵詞操作,其過程分為兩階段:第一階段,使用 new 在堆上尋找可用內存,分配給對象;第二階段,調用構造函數生成對象 。將 new 操作設置為私有,那么第一階段就無法完成,就不能夠在堆上生成對象 。
- java語言要學多久 java語言學多久
- linux常用命令查看內存 linux中查看內存使用情況的命令
- 簡要概述計算機語言的發展和分類 計算機語言發展階段分為
- ios系統開發語言 ios應用開發語言
- c語言的開發環境有哪些 C語言開發環境是什么
- mac怎么看內存占用了多少 mac如何看內存占用
- c語言編程小游戲 c語言代碼游戲編程
- c語言字符串輸入函數gets的編寫 C語言字符串輸入函數
- 外國企業申請商標注冊 國外企業在國內注冊商標
- c++階乘函數怎么寫 c語言編寫階乘函數
