C++內(nèi)存模型&空指針、野指針、函數(shù)指針和回調(diào)函數(shù)

C++內(nèi)存模型

棧與堆的區(qū)別:
1.管理方式不同
棧是系統(tǒng)自動管理的,在超出作用域后,將自動被釋放
堆是手動釋放,若程序中不釋放,程序結(jié)束后將由操作系統(tǒng)回收
2.空間大小不同
堆的大小受限于物理內(nèi)存范圍
棧小的可憐,一般為8M(可通過更改系統(tǒng)配置來增加棧的大小)
3.分配方式不同
堆是動態(tài)分配
棧既支持動態(tài)分配也支持靜態(tài)分配
4.分配效率不同
棧是系統(tǒng)中提供的數(shù)據(jù)結(jié)構(gòu)
堆是C++函數(shù)庫提供(鏈表)
5.是否產(chǎn)生碎片
棧:不會產(chǎn)生碎片
堆:由于頻繁分配和釋放,會造成內(nèi)存空間的不連續(xù),產(chǎn)生碎片
6.增長方向不同
棧向下增長???降序分配內(nèi)存地址
堆向上增長???升序分配內(nèi)存地址
指針
1.空指針
在C++中講指針初始化為?**0**?和?**NULL**?都代表空指針
?在C++中添加的**nullptr**可以保證在任何情況下都代表空指針(建議使用)
?使用空指針的后果
對空指針解引用,程序會崩潰
int?*p=NULL;
cout?<<"&p="<<&p<<endl;?????//對空指針解引用,程序會崩潰
2.對空指針使用delete運算符,系統(tǒng)會忽略該操作,程序不會崩潰
?為什么空指針訪問會出現(xiàn)異常
空指針是程序無論何時都沒有物理存儲器與之對應的地址,而為了確保“無論何時”這個條件,人們定義了空指針的空閑分區(qū)(0x00000000~0x0000ffff)
2.野指針
指針指向的不是一個有效(合法)的內(nèi)存地址
?出現(xiàn)野指針的情況(三種)
1.指針在定義時未初始化,其值不確定
2.指向堆分配的內(nèi)存被釋放時,指針指向的地址無效
3.指針指向的變量已超越了變量作用域
??針對的解決方法
1.將指針初始化為nullptr
2.堆內(nèi)存釋放后將指針置為nullptr
3.函數(shù)不返回局部變量的地址
3.函數(shù)指針和回調(diào)函數(shù)
?使用函數(shù)指針的3個步驟
1.聲明函數(shù)指針
2.函數(shù)指針指向函數(shù)地址(在C++中,函數(shù)名就是函數(shù)地址)
3.通過函數(shù)指針調(diào)用函數(shù)