最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

全局靜態(tài)存儲(chǔ)區(qū)、堆區(qū)和棧區(qū)深入剖析

 更新時(shí)間:2012年11月12日 11:41:16   作者:  
在C++中,內(nèi)存可分為系統(tǒng)數(shù)據(jù)區(qū),自由存儲(chǔ)區(qū),文本區(qū),const數(shù)據(jù)區(qū),全局靜態(tài)區(qū),堆區(qū)和棧區(qū)
在C++中,內(nèi)存可分為系統(tǒng)數(shù)據(jù)區(qū),自由存儲(chǔ)區(qū),文本區(qū),const數(shù)據(jù)區(qū),全局靜態(tài)區(qū),堆區(qū)和棧區(qū)。其中,系統(tǒng)數(shù)據(jù)區(qū)存放的是系統(tǒng)數(shù)據(jù),我們是不能自由訪問(wèn)的,有時(shí)候windows系統(tǒng)會(huì)突然彈出一個(gè)消息框,內(nèi)容是“內(nèi)存不能為read”就是錯(cuò)誤訪問(wèn)系統(tǒng)數(shù)據(jù)區(qū)的結(jié)果;自由存儲(chǔ)區(qū)用來(lái)存放由C延伸而來(lái)的malloc()函數(shù)所分配的數(shù)據(jù);文本區(qū)存放著我們的函數(shù)代碼,我們調(diào)用函數(shù)時(shí)的底層行為就類(lèi)似于先去操作一個(gè)指針,而這個(gè)指針就指向函數(shù)指令所在的地址,也就是在文本區(qū)中;const數(shù)據(jù)區(qū),顧名思義,就是存放不可修改的數(shù)據(jù)的內(nèi)存區(qū)域,我們定義的const變量都存放在這里。最后,我們來(lái)看全局靜態(tài)存儲(chǔ)區(qū)、堆區(qū)和棧區(qū)。

先來(lái)看全局靜態(tài)存儲(chǔ)區(qū),在程序中,由static標(biāo)號(hào)定義的數(shù)據(jù)都存放在全局靜態(tài)存儲(chǔ)區(qū)中,不論是在main()函數(shù)之外的定義的全局變量,還是在子函數(shù)中定義的局部變量,只要在定義之前有static標(biāo)號(hào),定義之后就會(huì)始終存在于全局靜態(tài)存儲(chǔ)區(qū)中。當(dāng)然,在main()函數(shù)之外定義的全局靜態(tài)變量在任何地方都可以訪問(wèn),而在子函數(shù)中定義的局部靜態(tài)變量只有在定義該變量的模塊中可見(jiàn)。但是也存在這樣一種現(xiàn)象:如前邊所述,即使在子函數(shù)中定義的局部靜態(tài)變量,其存在形式也是靜態(tài)的,也就是說(shuō),只要在變量定義的語(yǔ)句執(zhí)行之后,即使在變量不可見(jiàn)的地方,只要對(duì)該變量所在的地址取地址解析操作,也是可以獲得該變量的值的。比如我們?cè)诤瘮?shù)fun()中定義了一個(gè)static int a=100;假設(shè)該變量的地址是0x0042AD54,我們?cè)趍ain()函數(shù)中調(diào)用fun()之后,如果對(duì)0x0042AD54取地址解析,也是可以得到100的:int* p=(int*)0x0042ad54; int b=*p;這里b被賦值100。由此,我們可以看到,凡是有static定義的變量的生命周期就是整個(gè)程序的生命周期,直到程序退出,靜態(tài)變量所占據(jù)的內(nèi)存才會(huì)被釋放。

堆存儲(chǔ)區(qū)的行為類(lèi)似于靜態(tài)存儲(chǔ)區(qū),當(dāng)我們?cè)诙焉戏峙鋬?nèi)存之后,如果不進(jìn)行手動(dòng)的釋放,其內(nèi)存是不會(huì)自動(dòng)釋放掉的。但是在JAVA中,有一種叫做垃圾清理的機(jī)制可以自動(dòng)清理堆內(nèi)存,但是在C++中沒(méi)有這樣的機(jī)制。也就是說(shuō),在C++中,如果我們分配了堆內(nèi)存,就必須手動(dòng)釋放它。否則如果我們不停的分配堆內(nèi)存,但是不對(duì)其進(jìn)行釋放,當(dāng)對(duì)內(nèi)存被耗盡是就會(huì)造成程序崩潰。

一般地,用new分配的變量是存放于堆內(nèi)存中的,但是返回的指針變量是存放在棧中的。當(dāng)我們?cè)谝粋€(gè)子函數(shù)中new了一個(gè)變量,但是在函數(shù)返回時(shí)既沒(méi)有保存new返回的指針,也沒(méi)有delete時(shí),就會(huì)造成內(nèi)存泄露。如果我們寫(xiě)的是服務(wù)器程序,不斷地內(nèi)存泄露所造成的最終結(jié)果就是服務(wù)器死機(jī)。但是在windows、linux以及其他一些成熟的系統(tǒng)中,都有類(lèi)似于內(nèi)存保護(hù)的機(jī)制。系統(tǒng)會(huì)給用戶(hù)程序分配一定的運(yùn)行所需的內(nèi)存,同是也會(huì)給系統(tǒng)自身的運(yùn)行保留一部分內(nèi)存,這部分內(nèi)存是用戶(hù)程序所不能訪問(wèn)的。如果我們編寫(xiě)的程序存在內(nèi)存泄露,當(dāng)耗盡系統(tǒng)給應(yīng)用程序分配的內(nèi)存之后,程序就會(huì)停止運(yùn)行,而不會(huì)造成系統(tǒng)的司機(jī)。

至于棧內(nèi)存,也是我們?cè)趯?xiě)程序中用到的最多的情況。程序中定義的每一個(gè)臨時(shí)對(duì)象,new所返回的指針,以及遞歸函數(shù)中變量都是存放在棧中的。棧內(nèi)存是可以自動(dòng)釋放的,當(dāng)我們?cè)谀硞€(gè)模塊中定義了一個(gè)對(duì)象,在該模塊結(jié)束時(shí),變量所占據(jù)的內(nèi)存就會(huì)被系統(tǒng)回收,在定義新的變量時(shí),新的變量就有可能存放在原變量所在的地址上,但是在系統(tǒng)回收棧內(nèi)存的時(shí)候,是不會(huì)清空所釋放的棧內(nèi)存中的數(shù)據(jù)的,只是將棧頂重新調(diào)整,并在新數(shù)據(jù)的到來(lái)時(shí)將其分配到棧頂。

在C++中,雖然可以自由操作內(nèi)存,但這種技術(shù)就像是一把雙刃劍,用好了鋒利無(wú)比,用不好反而會(huì)造成一些自己都不能理解的莫名其妙的結(jié)果。深入理解內(nèi)存的分配方式,對(duì)于實(shí)際編程是大有助益的。

相關(guān)文章

  • 在C++?中慎用setjmp和longjmp解析

    在C++?中慎用setjmp和longjmp解析

    setjmp和longjmp是C語(yǔ)言中用于實(shí)現(xiàn)非局部跳轉(zhuǎn)的函數(shù),setjmp和longjmp 是 C 語(yǔ)言中一個(gè)很強(qiáng)大的函數(shù),這篇文章主要介紹了在C++?中慎用setjmp和longjmp的相關(guān)知識(shí),需要的朋友可以參考下
    2023-06-06
  • C++同步線(xiàn)程實(shí)現(xiàn)示例詳解

    C++同步線(xiàn)程實(shí)現(xiàn)示例詳解

    這篇文章主要介紹了C++同步線(xiàn)程實(shí)現(xiàn)示例,線(xiàn)程同步是指同一進(jìn)程中的多個(gè)線(xiàn)程互相協(xié)調(diào)工做從而達(dá)到一致性。之因此須要線(xiàn)程同步,是由于多個(gè)線(xiàn)程同時(shí)對(duì)一個(gè)數(shù)據(jù)對(duì)象進(jìn)行修改操做時(shí),可能會(huì)對(duì)數(shù)據(jù)形成破壞
    2022-11-11
  • C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系

    C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系

    這篇文章主要介紹了C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++ map用法總結(jié)(整理)

    C++ map用法總結(jié)(整理)

    這篇文章主要介紹了C++ map用法總結(jié)(整理),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++實(shí)現(xiàn)圖書(shū)館案例

    C++實(shí)現(xiàn)圖書(shū)館案例

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)館案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • VS中PCL庫(kù)附加依賴(lài)項(xiàng)配置過(guò)程解析

    VS中PCL庫(kù)附加依賴(lài)項(xiàng)配置過(guò)程解析

    這篇文章主要介紹了VS中PCL庫(kù)附加依賴(lài)項(xiàng)配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C語(yǔ)言文件操作詳解以及詳細(xì)步驟

    C語(yǔ)言文件操作詳解以及詳細(xì)步驟

    文件(file)一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt,?.bmp,?jpg.?.exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言文件操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    這篇文章主要介紹了VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法,實(shí)例分析了比較典型的錯(cuò)誤及對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2015-05-05
  • C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作

    C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++深淺拷貝及簡(jiǎn)易string類(lèi)實(shí)現(xiàn)方式

    C++深淺拷貝及簡(jiǎn)易string類(lèi)實(shí)現(xiàn)方式

    這篇文章主要介紹了C++深淺拷貝及簡(jiǎn)易string類(lèi)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

揭阳市| 若羌县| 崇左市| 浪卡子县| 景泰县| 高平市| 慈利县| 宁晋县| 南开区| 大安市| 庆安县| 登封市| 灵武市| 方山县| 武安市| 嵩明县| 宜昌市| 咸阳市| 营山县| 龙江县| 泰安市| 浑源县| 左云县| 永年县| 平江县| 资溪县| 佳木斯市| 城固县| 海丰县| 东山县| 海林市| 连城县| 彭阳县| 太谷县| 成都市| 石台县| 宁晋县| 安徽省| 青州市| 义乌市| 怀化市|