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

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

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

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

堆存儲區(qū)的行為類似于靜態(tài)存儲區(qū),當我們在堆上分配內(nèi)存之后,如果不進行手動的釋放,其內(nèi)存是不會自動釋放掉的。但是在JAVA中,有一種叫做垃圾清理的機制可以自動清理堆內(nèi)存,但是在C++中沒有這樣的機制。也就是說,在C++中,如果我們分配了堆內(nèi)存,就必須手動釋放它。否則如果我們不停的分配堆內(nèi)存,但是不對其進行釋放,當對內(nèi)存被耗盡是就會造成程序崩潰。

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

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

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

相關(guān)文章

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

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

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

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

    這篇文章主要介紹了C++同步線程實現(xiàn)示例,線程同步是指同一進程中的多個線程互相協(xié)調(diào)工做從而達到一致性。之因此須要線程同步,是由于多個線程同時對一個數(shù)據(jù)對象進行修改操做時,可能會對數(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é)(整理),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C++實現(xiàn)圖書館案例

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

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

    VS中PCL庫附加依賴項配置過程解析

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

    C語言文件操作詳解以及詳細步驟

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

    VC外部符號錯誤_main,_WinMain@16,__beginthreadex解決方法

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

    C語言實現(xiàn)循環(huán)隊列基本操作

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

    C++深淺拷貝及簡易string類實現(xiàn)方式

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

最新評論

澄城县| 睢宁县| 南汇区| 永康市| 方城县| 北辰区| 临高县| 抚顺市| 延长县| 潜山县| 三原县| 梓潼县| 呼伦贝尔市| 黑龙江省| 白银市| 德保县| 塔河县| 乌苏市| 汤原县| 澄城县| 禄劝| 太和县| 阳春市| 青河县| 鞍山市| 宁德市| 云南省| 泗阳县| 韶山市| 普定县| 都兰县| 沧源| 康保县| 颍上县| 亳州市| 即墨市| 龙里县| 平泉县| 宝坻区| 恭城| 晋宁县|