最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++全面覆蓋內(nèi)存管理知識講解

 更新時間:2022年06月18日 08:40:18   作者:努力變好的zz  
本章主要介紹C語言與C++的內(nèi)存管理,以C++的內(nèi)存分布作為引入,介紹C++不同于C語言的內(nèi)存管理方式(new delete對比 malloc free),感興趣的朋友來看看吧

前言

C語言內(nèi)存管理方式在C++中可以繼續(xù)使用,但有些地方就無能為力而且使用起來比較麻煩,因此C++又提出了自己的內(nèi)存管理方式:通過new和delete操作符進行動態(tài)內(nèi)存管理。

一、C++內(nèi)存管理方式

1.1new/delete操作內(nèi)置類型

void Test()
{
// 動態(tài)申請一個int類型的空間
int* ptr4 = new int;
// 動態(tài)申請一個int類型的空間并初始化為10
int* ptr5 = new int(10);
// 動態(tài)申請10個int類型的空間
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續(xù)的空間,使用new[]和delete[]

二、operator new與operator delete函數(shù)

2.1operator new與operator delete函數(shù)

new和delete是用戶進行動態(tài)內(nèi)存申請和釋放的操作符,operator new 和operator delete是系統(tǒng)提供的全局函數(shù),new在底層調(diào)用operator new全局函數(shù)來申請空間,delete在底層通過operator delete全局函數(shù)來釋放空間。

/*
operator new:該函數(shù)實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,
嘗試執(zhí)行空 間不足應對措施,如果改應對措施用戶設置了,則繼續(xù)申請,否則拋異常。
*/
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);
}
/*
operator delete: 該函數(shù)最終是通過free來釋放空間的
*/
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)
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

通過上述兩個全局函數(shù)的實現(xiàn)知道,operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執(zhí)行用戶提供的空間不足應對措施,如果用戶提供該措施就繼續(xù)申請,否則就拋異常。operator delete 最終是通過free來釋放空間的。

二、new和delete的實現(xiàn)原理

2.1內(nèi)置類型

如果申請的是內(nèi)置類型的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new[]和delete[]申請的是連續(xù)空間,而且new在申請空間失敗時會拋異常,malloc會返回NULL。

2.2 自定義類型

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來釋放空間

到此這篇關于C++全面覆蓋內(nèi)存管理知識講解的文章就介紹到這了,更多相關C++內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 如何實現(xiàn)一個日期類

    C++ 如何實現(xiàn)一個日期類

    通過對類和對象的學習,理解了類是對象的抽象描述,實現(xiàn)日期類涉及定義年月日屬性及成員函數(shù)如打印日期、日期加減,重點介紹了運算符重載的概念和作用,通過代碼示例展示了如何實現(xiàn)一個日期類,包括頭文件和源文件的分離編寫
    2024-10-10
  • C++形參與實參的區(qū)別實例解析

    C++形參與實參的區(qū)別實例解析

    這篇文章主要介紹了C++形參與實參的區(qū)別實例解析,需要的朋友可以參考下
    2014-07-07
  • Qt Design Studio安裝圖文教程

    Qt Design Studio安裝圖文教程

    本文主要介紹了Qt Design Studio安裝圖文教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C語言實現(xiàn)線索二叉樹的定義與遍歷示例

    C語言實現(xiàn)線索二叉樹的定義與遍歷示例

    這篇文章主要介紹了C語言實現(xiàn)線索二叉樹的定義與遍歷,結(jié)合具體實例形式分析了基于C語言的線索二叉樹定義及遍歷操作相關實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • C++中操作符的前置與后置有什么區(qū)別

    C++中操作符的前置與后置有什么區(qū)別

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關系操作符,邏輯操作符,條件操作符等。接下了讓我們詳細了解掌握它
    2022-05-05
  • 基于C語言實現(xiàn)學生選課系統(tǒng)

    基于C語言實現(xiàn)學生選課系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)學生選課系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載允許同名函數(shù)根據(jù)參數(shù)列表的不同而執(zhí)行不同的功能,這依賴于名字修飾或名字改編(Name Mangling)機制,而引用則是為變量創(chuàng)建一個別名,不會開辟新的內(nèi)存空間,本文介紹了C++中函數(shù)重載與引用的操作,感興趣的朋友一起看看吧
    2024-10-10
  • 對比分析C語言中的gcvt()和ecvt()以及fcvt()函數(shù)

    對比分析C語言中的gcvt()和ecvt()以及fcvt()函數(shù)

    這篇文章主要介紹了對比分析C語言中的gcvt和ecvt以及fcvt函數(shù),都是將數(shù)字轉(zhuǎn)化為字符串,注意其之間的功能區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++11、C++14、C++17、C++20常用新特性

    C++11、C++14、C++17、C++20常用新特性

    本文主要介紹了C++11、C++14、C++17、C++20常用新特性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C語言 風靡一時的黃金礦工游戲?qū)崿F(xiàn)流程詳解

    C語言 風靡一時的黃金礦工游戲?qū)崿F(xiàn)流程詳解

    《黃金礦工》是一款非常經(jīng)典的游戲。在游戲中,玩家通過不斷挖礦,獲取金子,最終能夠闖入下一關。在這個過程中,會不斷有巖石、煙霧、老鼠來搗亂,甚至還會出現(xiàn)扛著炸藥包的小老鼠,玩家必須戰(zhàn)勝它們,才能進入更深的礦坑
    2021-11-11

最新評論

项城市| 偏关县| 腾冲县| 河津市| 巢湖市| 兴城市| 兴隆县| 白朗县| 台中县| 阳曲县| 博湖县| 佛学| 盐津县| 松滋市| 巴塘县| 惠安县| 固阳县| 巫溪县| 绥棱县| 丰都县| 长春市| 六盘水市| 弋阳县| 东丽区| 登封市| 江安县| 西乌珠穆沁旗| 黑龙江省| 山丹县| 洞口县| 庆安县| 宁明县| 长丰县| 贵阳市| 正定县| 延寿县| 玉山县| 增城市| 班玛县| 高安市| 南乐县|