C++基礎(chǔ)語(yǔ)法梳理:內(nèi)存分配和管理
本期是C++基礎(chǔ)語(yǔ)法分享的第八節(jié),今天給大家來(lái)分享一下:
(1)內(nèi)存分配和管理;
(2)malloc、free;
(3)new、delete;
(4)定位 new;
(5)delete this 合法嗎?
(6)如何定義一個(gè)只能在堆上(棧上)生成對(duì)象的類?

內(nèi)存分配和管理
malloc、calloc、realloc、alloca
malloc:申請(qǐng)指定字節(jié)數(shù)的內(nèi)存。申請(qǐng)到的內(nèi)存中的初始值不確定。
calloc:為指定長(zhǎng)度的對(duì)象,分配能容納其指定個(gè)數(shù)的內(nèi)存。申請(qǐng)到的內(nèi)存的每一位(bit)都初始化為 0。
realloc:更改以前分配的內(nèi)存長(zhǎng)度(增加或減少)。當(dāng)增加長(zhǎng)度時(shí),可能需將以前分配區(qū)的內(nèi)容移到另一個(gè)足夠大的區(qū)域,而新增區(qū)域內(nèi)的初始值則不確定。
alloca:在棧上申請(qǐng)內(nèi)存。程序在出棧的時(shí)候,會(huì)自動(dòng)釋放內(nèi)存。但是需要注意的是,alloca 不具可移植性, 而且在沒有傳統(tǒng)堆棧的機(jī)器上很難實(shí)現(xiàn)。alloca 不宜使用在必須廣泛移植的程序中。C99 中支持變長(zhǎng)數(shù)組 (VLA),可以用來(lái)替代 alloca。
malloc、free
用于分配、釋放內(nèi)存
malloc、free 使用
申請(qǐng)內(nèi)存,確認(rèn)是否申請(qǐng)成功
釋放內(nèi)存后指針置空
new、delete
new / new[]:完成兩件事,先底層調(diào)用 malloc 分配了內(nèi)存,然后調(diào)用構(gòu)造函數(shù)(創(chuàng)建對(duì)象)。
delete/delete[]:也完成兩件事,先調(diào)用析構(gòu)函數(shù)(清理資源),然后底層調(diào)用 free 釋放空間。
new 在申請(qǐng)內(nèi)存時(shí)會(huì)自動(dòng)計(jì)算所需字節(jié)數(shù),而 malloc 則需我們自己輸入申請(qǐng)內(nèi)存空間的字節(jié)數(shù)。
new、delete 使用
申請(qǐng)內(nèi)存,確認(rèn)是否申請(qǐng)成功
定位 new
定位 new(placement new)允許我們向 new 傳遞額外的地址參數(shù),從而在預(yù)先指定的內(nèi)存區(qū)域創(chuàng)建對(duì)象。
(1)place_address?是個(gè)指針
(2)initializers?提供一個(gè)(可能為空的)以逗號(hào)分隔的初始值列表
delete this 合法嗎?
合法,但:
必須保證 this 對(duì)象是通過?new(不是?new[]、不是 placement new、不是棧上、不是全局、不是其他對(duì)象成員)分配的
必須保證調(diào)用?delete this?的成員函數(shù)是最后一個(gè)調(diào)用 this 的成員函數(shù)
必須保證成員函數(shù)的?delete this?后面沒有調(diào)用 this 了
必須保證?delete this?后沒有人使用了
如何定義一個(gè)只能在堆上(棧上)生成對(duì)象的類?
只能在堆上
方法:將析構(gòu)函數(shù)設(shè)置為私有
原因:C++ 是靜態(tài)綁定語(yǔ)言,編譯器管理?xiàng)I蠈?duì)象的生命周期,編譯器在為類對(duì)象分配??臻g時(shí),會(huì)先檢查類的析構(gòu)函數(shù)的訪問性。若析構(gòu)函數(shù)不可訪問,則不能在棧上創(chuàng)建對(duì)象。
只能在棧上
方法:將 new 和 delete 重載為私有
原因:在堆上生成對(duì)象,使用 new 關(guān)鍵詞操作,其過程分為兩階段:第一階段,使用 new 在堆上尋找可用內(nèi)存,分配給對(duì)象;第二階段,調(diào)用構(gòu)造函數(shù)生成對(duì)象。將 new 操作設(shè)置為私有,那么第一階段就無(wú)法完成,就不能夠在堆上生成對(duì)象。
今天的分享就到這里了,大家要好好學(xué)C++喲~
寫在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
