你要的內(nèi)存真的是你的嗎
在linux上c或者c++常會(huì)用到堆內(nèi)存分配函數(shù)malloc需纳,malloc接受一個(gè)需要分配空間大小的參數(shù)般码,然后返回分配好的內(nèi)存空間地址担锤,通常會(huì)判斷它的返回值是否為NULL,如果為NULL代表內(nèi)存分配失敗儿礼。但是有些情況下即使返回了非NULL咖杂,當(dāng)向新的內(nèi)存地址中寫入數(shù)據(jù)時(shí)會(huì)遭遇失敗(oom或者其他錯(cuò)誤)蚊夫。
原因是linux的copy on write(cow)策略诉字,只有寫入時(shí)才會(huì)真正分配內(nèi)存。malloc返回的都是虛擬內(nèi)存地址知纷,當(dāng)寫入時(shí)才會(huì)分配物理內(nèi)存壤圃。
linux會(huì)有一個(gè)零頁(yè)。malloc時(shí)分配的內(nèi)存指向零頁(yè)琅轧。
內(nèi)存預(yù)分配還管用嗎
思考:一般分配內(nèi)存后會(huì)立即使用(寫入)伍绳;當(dāng)希望做一些空間預(yù)分配,減少后續(xù)多次分配帶來(lái)的性能消耗時(shí)(類似自己管理內(nèi)存)鹰晨,底層其實(shí)也沒(méi)有真正為你分配內(nèi)存墨叛,這不是很尷尬嗎?當(dāng)然可以通過(guò)分配后寫入些什么(比如memset為0)來(lái)保證真正分配了物理內(nèi)存模蜡。
參考以下文章和討論: