想必很多學習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呼叫析構函式清理 釋...