C C 記憶體管理

2021-09-30 17:22:10 字數 2410 閱讀 5964

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

int globalvar = 1;

static int staticglobalvar = 1;

void test()

; char char2 = "abcd";

char* pchar3 = "abcd";

int* ptr1 = (int*)malloc(sizeof(int)* 4);

int* ptr2 = (int*)calloc(4 ,sizeof(int));

int* ptr3 = (int*)realloc(ptr2, sizeof(int)* 4);

free(ptr1);

free(ptr3);

}

在棧上的有:localvar、num1、char2、pchar3、ptr1、*char2(char2是陣列,在棧上開闢了空間,char2是char2解引用後

將**段的常量拷貝到char2陣列上,即拷貝到棧上,故char2在棧上)

在堆上的有:*ptr1(*ptr1指向動態開闢的空間)

在資料段上:globalvar、staticglobalvar、staticvar

在**段上:*pchar3(pchar3是指標,pchar3是解引用後,指標指向常量的位址,故pchar3在**段)

sizeof(num1) = 40; sizeof(char2) = 5; //(還有』/0』)

sizeof(pchar3) = 4; sizeof(ptr1) = 4; //指標32位情況下為4個位元組,64為情況下為8個位元組

strlen(char2) = 4; strlen(pchar3) = 4; //strlen遇』/0』結束

說明:(1)棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的

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

(3)堆用於程式執行時動態記憶體分配,堆是可以向上增長的

(4)資料段:儲存全域性資料和靜態資料

(5)**段:可執行的**/唯讀常量

擴充套件

int main()

二、c語言中動態記憶體管理方式

malloc:開空間

calloc:開空間 + 初始化

realloc:擴容

void test()

三、c++記憶體管理

通過new和delete操作符進行動態記憶體管理。

1、new/delete操作內建型別

void test()

2、new和delete操作自定義型別

class a

~a()

private:

int _data;

};void test1()

void test2()

注:在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,而malloc和free不會

四、operator new與operator delete函式

new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new和operator delete是系統提供的全域性函式,new在底層呼叫operator new全域性函式來申請空間,delete在底層呼叫operator delete全域性函式來釋放空間。operator new實際也是通過malloc來申請空間,operator delete最終通過free來釋放空間。

五、new和delete是實現原理

1、內建型別

new和malloc,delete和free基本類似,不同的是:new在申請空間失敗時會拋異常,malloc會返回null。

2、自定義型別

new的原理:

(1)呼叫operator new函式申請空間。

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

delete的原理:

(1)在空間上執行析構函式,完成物件中資源的清理工作。

(2)呼叫operator delete函式釋放空間。

new t[n]的原理:

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

(2)在申請的空間上執行n次建構函式。

delete t[n]的原理:

(1)在空間上執行n次析構函式,完成n個物件中資源的清理工作。

(2)呼叫operator delete釋放空間,實際在operator new中呼叫operator delete釋放空間。

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...