C 語(yǔ)言內(nèi)存管理指對(duì)系統(tǒng)內(nèi)存的分配、創(chuàng)建、使用這一系列操作。在內(nèi)存管理中,由于是操作系統(tǒng)內(nèi)存,使用不當(dāng)會(huì)造成畢竟麻煩的結(jié)果。本文將從系統(tǒng)內(nèi)存的分配、創(chuàng)建出發(fā),并且使用例子來(lái)舉例說(shuō)明內(nèi)存管理不當(dāng)會(huì)出現(xiàn)的情況及解決辦法。
一、內(nèi)存
在計(jì)算機(jī)中,每個(gè)應(yīng)用程序之間的內(nèi)存是相互獨(dú)立的,通常情況下應(yīng)用程序 A 并不能訪問(wèn)應(yīng)用程序 B,當(dāng)然一些特殊技巧可以訪問(wèn),但此文并不詳細(xì)進(jìn)行說(shuō)明。例如在計(jì)算機(jī)中,一個(gè)視頻播放程序與一個(gè)瀏覽器程序,它們的內(nèi)存并不能訪問(wèn),每個(gè)程序所擁有的內(nèi)存是分區(qū)進(jìn)行管理的。在計(jì)算機(jī)系統(tǒng)中,運(yùn)行程序 A 將會(huì)在內(nèi)存中開(kāi)辟程序 A 的內(nèi)存區(qū)域 1,運(yùn)行程序 B 將會(huì)在內(nèi)存中開(kāi)辟程序 B 的內(nèi)存區(qū)域 2,內(nèi)存區(qū)域 1 與內(nèi)存區(qū)域 2 之間邏輯分隔。
1.1 內(nèi)存四區(qū)
在程序 A 開(kāi)辟的內(nèi)存區(qū)域 1 會(huì)被分為幾個(gè)區(qū)域,這就是內(nèi)存四區(qū),內(nèi)存四區(qū)分為棧區(qū)、堆區(qū)、數(shù)據(jù)區(qū)與代碼區(qū)。棧區(qū)指的是存儲(chǔ)一些臨時(shí)變量的區(qū)域,臨時(shí)變量包括了局部變量、返回值、參數(shù)、返回地址等,當(dāng)這些變量超出了當(dāng)前作用域時(shí)將會(huì)自動(dòng)彈出。該棧的最大存儲(chǔ)是有大小的,該值固定,超過(guò)該大小將會(huì)造成棧溢出。堆區(qū)指的是一個(gè)比較大的內(nèi)存空間,主要用于對(duì)動(dòng)態(tài)內(nèi)存的分配;在程序開(kāi)發(fā)中一般是開(kāi)發(fā)人員進(jìn)行分配與釋放,若在程序結(jié)束時(shí)都未釋放,系統(tǒng)將會(huì)自動(dòng)進(jìn)行回收。數(shù)據(jù)區(qū)指的是主要存放全局變量、常量和靜態(tài)變量的區(qū)域,數(shù)據(jù)區(qū)又可以進(jìn)行劃分,分為全局區(qū)與靜態(tài)區(qū)。全局變量與靜態(tài)變量將會(huì)存放至該區(qū)域。代碼區(qū)就比較好理解了,主要是存儲(chǔ)可執(zhí)行代碼,該區(qū)域的屬性是只讀的。