堆空間
? 在程序運行過程场绿,為了能夠自由控制內(nèi)存的生命周期、大小延柠,會經(jīng)常使用堆空間的內(nèi)存
? 堆空間的申請\釋放
?malloc \ free
?new \ delete
?new [] \ delete []
?注意
?申請堆空間成功后遣铝,會返回那一段內(nèi)存空間的地址
?申請和釋放必須是1對1的關(guān)系冻河,不然可能會存在內(nèi)存泄露
? 現(xiàn)在的很多高級編程語言不需要開發(fā)人員去管理內(nèi)存(比如Java),屏蔽了很多內(nèi)存細節(jié)棒动,利弊同時存在
?利:提高開發(fā)效率糙申,避免內(nèi)存使用不當或泄露
?弊:不利于開發(fā)人員了解本質(zhì),永遠停留在API調(diào)用和表層語法糖迁客,對性能優(yōu)化無從下手
堆空間的初始化
memset
? memset函數(shù)是將較大的數(shù)據(jù)結(jié)構(gòu)(比如對象郭宝、數(shù)組等)內(nèi)存清零的比較快的方法
對象的內(nèi)存
? 對象的內(nèi)存可以存在于3種地方
?全局區(qū)(數(shù)據(jù)段):全局變量
?棧空間:函數(shù)里面的局部變量
?堆空間:動態(tài)申請內(nèi)存(malloc掷漱、new等)
構(gòu)造函數(shù)(Constructor)
? 構(gòu)造函數(shù)(也叫構(gòu)造器)粘室,在對象創(chuàng)建的時候自動調(diào)用,一般用于完成對象的初始化工作
?特點
?函數(shù)名與類同名卜范,無返回值(void都不能寫)衔统,可以有參數(shù),可以重載,可以有多個構(gòu)造函數(shù)
?一旦自定義了構(gòu)造函數(shù)锦爵,必須用其中一個自定義的構(gòu)造函數(shù)來初始化對象
?注意
?通過malloc分配的對象不會調(diào)用構(gòu)造函數(shù)
? 一個廣為流傳的舱殿、很多教程\書籍都推崇的錯誤結(jié)論:
?默認情況下,編譯器會為每一個類生成空的無參的構(gòu)造函數(shù)
?正確理解:在某些特定的情況下险掀,編譯器才會為類生成空的無參的構(gòu)造函數(shù) ? (哪些特定的情況?以后再提)
構(gòu)造函數(shù)的調(diào)用
默認情況下沪袭,成員變量的初始化
? 如果自定義了構(gòu)造函數(shù),除了全局區(qū)樟氢,其他內(nèi)存空間的成員變量默認都不會被初始化冈绊,需要開發(fā)人員手動初始化
成員變量的初始化
? 對象初始化