C C C 記憶體管理

2021-09-22 12:38:19 字數 2335 閱讀 4774

一、c/c++記憶體分布

棧:存放非靜態變數/函式引數/返回值,棧是向下增長的

記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的通風太記憶體庫,使用者可使用系統介面建立共享記憶體,做程序間通訊

堆:用於執行時的動態記憶體分配,堆是可以向上增長的

資料段:用於存放全域性資料與靜態資料

**段:用於存放可執行**/唯讀常量

二、c/c++動態記憶體管理方式

在c語言中主要由malloc/calloc/realloc開闢動態記憶體

用free來釋放

malloc/calloc/realloc的區別

malloc:函式原型void* malloc(unsigned int num_bytes),malloc需要使用者自己計算申請空間大小,如int* p = (int*)malloc(10*sizeof(int));注意此時申請的記憶體值是不確定的

calloc:函式原型void* calloc(size_t n,size_t size),與malloc的區別在於calloc不用手動計算空間大小,如int* p = (int*)calloc(10,sizeof(int)),並且calloc在申請後對空間內逐一進行初始化,初始化為0/void*/0.0因為多了初始化這一步驟,所以calloc的效率低於malloc

realloc:函式原型void* realloc(void* ptr,size_t new_size) 主要用於修改已申請的動態記憶體,ptr指向原來的空間基址的指標,new_size為需要擴容的大小,

需要加以說明的是:

呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊,然後將該記憶體塊一分為二(一塊與使用者申請的大小一樣,另一塊就是剩下的位元組)realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,則為new_size較小的情況,如果資料後面的位元組不夠,則為new_size較大的情況

new_size小於需要擴容的記憶體,將會造成資料丟失

new_size 較小,原來申請的空間記憶體後還有空餘的記憶體呢,系統將直接在原記憶體空間後進行擴容,並返回原動態記憶體基位址

new_size較大,原來申請空間後面沒有足夠的空間進行擴容,系統將重新申請一塊new_size+原記憶體大小的 記憶體,並吧原來空間的內容拷貝,然後free掉原來的空間

new_size非常大,系統記憶體申請失敗,返回null,原本的記憶體不會釋放

c++記憶體管理方式

因為c++相容c所以c的記憶體管理方式在c++中依舊可以使用,不過c終歸有些繁瑣,所以c++提出了它自己的記憶體管理方式:new 和 delete(運算子)

new和delete的實現原理:

申請內建型別:new與malloc、delete/free 基本相同,new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,new申請失敗會丟擲異常,malloc會返回null

自定義型別:

new原理:呼叫operator new函式申請空間

在申請的空間上執行建構函式,完成物件的構造

delete原理:在空間上執行析構函式,完成資源的清理工作

呼叫operatorr delete函式釋放物件的空間

new t[n]的原理

呼叫operator new函式,在operator new中實際呼叫operator new函式完成n個物件空間的申

請在申請的空間上執行n次建構函式

delete的原理

在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理

呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間

malloc/free 與 new/delete區別

1.malloc和free是函式,new和delete是操作符

4. malloc申請的空間不會初始化,new可以初始化

5. malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可

6. malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別

7. malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

8. 申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間

後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

9. new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free

C C C 記憶體管理

一.c c 記憶體分布 1.棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的 2.記憶體對映段是高效的i o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可以使用系統介面建立共享記憶體,做程序間通訊 3.堆用於程式執行時動態記憶體分配,堆是向上增長的 4.資料段,儲存全域性資料和...

C C C 之記憶體分布

一 基本知識 c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。2 堆 就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...