對於應用程式而言,記憶體中儲存區域大致有堆、棧、靜態區域三個部分。系統在分配記憶體的時候,會在記憶體中尋找乙個能夠滿足申請大小的區域進行標記,並返回此區域的大小。
在應用程式執行時,系統為應用程式分配的只是虛擬的位址空間,並不是實際的物理儲存器。這就需要給程序預定的區域(位址空間)調撥物理儲存器(記憶體),來存放相關的資料。但是通過cpu來進行操作,也可以將磁碟早上的頁交換檔案作為記憶體的一部分。通過頁交換檔案使得記憶體增加,但是同時將消耗大量cpu資源。
如果多個程序共享乙個記憶體對映檔案,在修改檔案內容時,系統會產生乙個新檢視,來複製當前檔案中的內容,也就是說,修改的其實是複製檢視的內容,修改完畢後,系統將新檢視的內容更新到原始檔中,此時所有共享此記憶體的程序全部會看到修改的內容。
堆:對於應用程式而言,是一塊由系統為應用程式而分配的記憶體區域。乙個程序預設的有乙個預設堆區域,程式中所有的記憶體申請,全部來自此區域。如:new/malloc申請的記憶體。在程序結束後,預設堆空間釋放。應用程式對堆的訪問原則上是順序的,如3個執行緒同時訪問堆,必須進行排隊。程式猿也可以不使用程序預設的堆,進行自己建立乙個堆。將 new操作符過載即可使用自己建立的堆空間。但是delete操作符也必須過載。
棧:乙個程序中,預設的也會有乙個棧區域,但是棧是由系統編譯器進行分配和銷毀。
靜態區域:程式中所有的靜態或者全域性變數都儲存在此區域,在程序結束後,由系統進行**。
順便提一下new和malloc.個人覺得要說兩者區別無非兩點:
1、 new是操作符,在申請記憶體的時候,編譯器會呼叫建構函式自動對申請的區域進行初始化。malloc是個函式,只會申請記憶體不會進行初始化。
2、 new申請的時候,必須指定型別,成功後會返回指定型別的指標。指標指向分配的記憶體位址。malloc 申請的時候,如果不強制指定型別,返回乙個void *的指標。也就是說申請的記憶體區域可以存放任何型別的資料。
兩者都是在堆上進行申請。new申請的物件在釋放後,應該講此物件的指標指向null,而不是不處理。
有關記憶體的思考題
摘自 高質量c c 程式設計指南 四 有關記憶體的思考題 20 分 void getmemory char p p char malloc 100 void test void char str null getmemory str strcpy str,hello world printf str...
有關記憶體的思考題
void getmemory char p void test void 請問執行test 函式會有什麼樣的結果?因為 getmemory 並不能傳遞動態記憶體,test 函式中的 str 一直都是 null。strcpy str,hello world 將使程式崩潰。2.char getmemor...
有關記憶體的思考題
注意下面4個測試函式的執行結果 測試函式1 void getmemory char p void test void 執行結果 程式崩潰。因為getmemory並不能傳遞動態記憶體,test函式中的str一直都是null。strcpy str,hello world 將使程式崩潰。測試函式2 cha...