C 之動態記憶體管理

2021-10-06 16:46:53 字數 2352 閱讀 1276

想必很多學習c++的人都有很深厚的c語言基礎.

在c語言中,我們是用malloc,calloc,realloc三位男士和free一位女士來動態管理記憶體的

先coding一下c語言的基本動態記憶體管理模式

void rammanagebyc()

然而這種初始化方式是有很大的缺陷的

首先它的初始化非常的難受,malloc申請的記憶體空間需要手動去初始化,calloc申請的記憶體空間雖然名義是初始化的,但是它不一定能按照我的意願去進行初始化,realloc和malloc相同,這大大降低了我們程式猿的幸福感

然而,這還不是最坑的,請看下邊的栗子

class date

~date()

{}private:

int _year;

int _month;

int _day;

};void testc()

現在我們既然來到了c++世界,就讓我們看下一種新的動態記憶體管理的方式

void rammanagebycplusplus()

對內建型別的變數申請記憶體說完以後,我們再來談談自定義型別

就比如對上面的日期類

void testcplusplus()

事實上對於我們的自定義型別,new和delete在管理記憶體的時候,會呼叫建構函式/析構函式,而malloc和free則不會

對於malloc,free,new,delete的使用需要注意的是

1.malloc/free,new/delete在使用上一定要對應起來

2.malloc和delete在使用時候,類似於函式呼叫,而我們的new /delete卻不然

,事實上,new 和 delete只是關鍵字,它們並不是函式

我接下來在介紹兩個重要的全域性函式

void* operator new(unsigned int n)

void operator delete(unsigned int n)

值得一提的是,他們不是運算子過載函式

而是系統全域性函式

事實上new和delete在底層就說通過這兩個函式來實現記憶體申請和銷毀工作的

當然我們也可以直接呼叫他們來完成記憶體的申請和釋放工作

下邊我們先研究一哈void* operator new(size_t n)//size_t和unsigned int乙個意思,這個想必大家都知道

比如說申請以乙個大小為sizeof(int)的空間

int* ptr=(int*)malloc(sizeof(int))

int* ptr1=(int*)operator new(sizeof(int))

這個使用方法確實和malloc乙個模打出來的

事實上,它的底層就是呼叫malloc函式來完成的

我們都知道malloc函式呼叫失敗的時候會返回null

但是operator new並不是這樣的

它當malloc申請記憶體失敗時會嘗試空間不足的應對措施,如果該應對措施可以解決記憶體不足的問題,那麼它會繼續嘗試申請,否則會丟擲異常

對於new申請自定義型別變數,它走的流程是:

operator new—>建構函式

下邊我們說一下void operator delete(void*)

正如大家所想象的那樣子,delete也是乙個全域性函式,它的底層實際上是呼叫了free

對於自定義型別物件的釋放,當我們用delete釋放自定義型別物件時走的流程就是析構函式 ->> void operator delete(void*)

寫到這裡,我們可以發現乙個問題

就是我們每次申請記憶體都要消耗時間,當然申請次數少不要緊,頻繁的話實際上是會影響效能的

事實上計算機給我們想了一種特別好的辦法去解決這個問題

就說記憶體池的思想

什麼是記憶體池呢,事實上,記憶體池就說乙個備胎,計算機並不是一次只申請你所要的那些記憶體,而是申請了很多,當你用的時候再從池子裡邊拿就可以,這樣就大大的優化了記憶體申請的開銷,我們都知道鍊錶是經常會申請記憶體的,現在我寫乙個鍊錶的類operator new過載函式幫助理解一下記憶體池的思想

class node

void* operator new(size_t n)

//記憶體池釋放

void operator new(void* p)

};我再說乙個顯示呼叫建構函式的方法

void test()

最後再說一下申請了記憶體不是放的後果(記憶體洩漏)

我們寫的程式會在執行結束的時候去釋放空間資源,對於執行時間很短,而且申請空間不大的程式來說,比如說我們經常寫的程式,這確實不是很要緊,但是對於乙個伺服器來說,它實際上是全天24小時執行的,如果有記憶體洩漏,就會造成記憶體不夠用的情況,從而導致伺服器程式徹底崩潰,因此記憶體洩漏在實際工作中是絕對不可以發生的,因此我們在使用new malloc申請的記憶體一定要及時的釋放

C 記憶體管理之四 動態記憶體管理

三 new delete拓展 四 記憶體耗盡怎麼辦 new delete與malloc free都是用於管理動態記憶體。其中malloc free是c標準庫函式,用於c程式的動態記憶體管理 new delete是c 的運算操作符,用於動態記憶體管理,功能完全覆蓋malloc free。new new...

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...