這篇文章主要為大家展示了“c/c++中如何實現(xiàn)內(nèi)存管理”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“c/c++中如何實現(xiàn)內(nèi)存管理”這篇文章吧。
成都創(chuàng)新互聯(lián)專注于安順企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。安順網(wǎng)站建設(shè)公司,為安順等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
內(nèi)存區(qū)域:
由這張圖我們可以看到程序在內(nèi)存中的分布,不同的變量存放在不同的區(qū)域,而內(nèi)核空間是用戶無法進行讀寫的用來存儲有關(guān)的信息。
要注意棧向下生長,堆向上生長,堆棧相對而生,我們今天主要談在堆上申請空間的相關(guān)知識,我們知道在c語言中想要在堆上申請空間需要用到malloc、realloc、calloc這類函數(shù),關(guān)于這些函數(shù)的相同與不同點大家可以參考我的另一篇博客。
在c++中我們用心的關(guān)鍵字 new、delete完成對空間的申請和釋放。語法是也是定義一個指針變量接受開辟的地址,int p=new int;c++允許我們對申請的空間初始化,只要在后面跟上(),()內(nèi)為要初始化的內(nèi)容即可。同時也可以用int p=new int[];的方式申請連續(xù)的內(nèi)存空間,這種方式在釋放時的方式為delete [] p;。
注意:在申請自定義類型時new和malloc是類似的,那么意味著對于內(nèi)置類型free和delete是可以混合使用的,用new申請的空間用free釋放也不會出現(xiàn)什么錯誤,而對于用戶自定義類型new和delete會分別調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),而malloc和free則不會,malloc申請的是與對象大小相同的一塊內(nèi)存空間,是不會構(gòu)成對象的,所以我們在申請和釋放空間時要注意配對!
我們在這里談?wù)刴alloc的原理:我們知道m(xù)alloc申請大小為10個字節(jié)的空間時系統(tǒng)會為我們申請大于十個字節(jié)的空間,大概申請來的空間是長這個樣子滴:
這也就是我們在free的時候系統(tǒng)會知道free多少個字節(jié),因為在這個類似于結(jié)構(gòu)體的結(jié)構(gòu)內(nèi)最前面已經(jīng)保存了我們申請空間大小的數(shù)值了。
這兩個函數(shù)是new和delete在底層調(diào)用的函數(shù),也就是這兩個函數(shù)為我們完成了內(nèi)存的開辟和釋放。
我們首先看看operator new這個函數(shù):
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) { // report no memory // 如果申請內(nèi)存失敗了,這里會拋出bad_alloc 類型異常 static const std::bad_alloc nomem; _RAISE(nomem); } return (p); }
從這個函數(shù)我們可以看到底層也是通過malloc實現(xiàn)的,那么malloc申請成功則直接返回,malloc申請失敗嘗試執(zhí)行空間不足的應(yīng)對措施,執(zhí)行這個措施就會繼續(xù)申請,否則拋出異常。所以new函數(shù)一般都不會申請失敗。
我們再來看operator delete這個函數(shù):
void operator delete(void *pUserData) { _CrtMemBlockHeader * pHead; RTCCALLBACK(_RTC_Free_hook, (pUserData, 0)); if (pUserData == NULL) return; _mlock(_HEAP_LOCK); /* block other threads */ __TRY /* get a pointer to memory block header */ pHead = pHdr(pUserData); /* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); _free_dbg( pUserData, pHead->nBlockUse ); __FINALLY _munlock(_HEAP_LOCK); /* release other threads */ __END_TRY_FINALLY return; }
通過這個我們知道底層也是通過free實現(xiàn)的就ok。
我們再看看對于自定義類型new和delete的原理:
new的原理
調(diào)用operator new函數(shù)申請空間
在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造
delete的原理
在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作
調(diào)用operator delete函數(shù)釋放對象的空間
new T[N]的原理
調(diào)用operator new[]函數(shù),在operator new[]中實際調(diào)用operator new函數(shù)完成N個對象空間的申
請
在申請的空間上執(zhí)行N次構(gòu)造函數(shù)
delete[]的原理
在釋放的對象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個對象中資源的清理
調(diào)用operator delete[]釋放空間,實際在operator delete[]中調(diào)用operator delete來釋放空間
最后的最后我們再細談一下malloc和new的區(qū)別:
1.new是操作符、malloc是函數(shù)
2.new可以完成對開辟空間的初始化、malloc則不能
3.malloc在使用時需要計算所開辟內(nèi)存的大?。ㄗ止?jié))并傳遞,而new只需跟上類型即可
4.malloc的返回值是void,所以要強制類型轉(zhuǎn)化,new后是類型則不需要。
5.malloc申請失敗會返回NULL,所以要進行判空,new不需要但需要捕獲異常
6.malloc和free不會調(diào)用構(gòu)造和析構(gòu)函數(shù)。
以上是“c/c++中如何實現(xiàn)內(nèi)存管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!