本期是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、delete
new / 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) type
new (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++ 是靜態綁定語言,編譯器管理棧上對象的生命周期,編譯器在為類對象分配??臻g時,會先檢查類的析構函數的訪問性。若析構函數不可訪問,則不能在棧上創建對象。
只能在棧上
方法:將 new 和 delete 重載為私有
原因:在堆上生成對象,使用 new 關鍵詞操作,其過程分為兩階段:第一階段,使用 new 在堆上尋找可用內存,分配給對象;第二階段,調用構造函數生成對象。將 new 操作設置為私有,那么第一階段就無法完成,就不能夠在堆上生成對象。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。