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

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

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

前言

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

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

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

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

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

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

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

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

/*
operator new:該函數(shù)實(shí)際通過(guò)malloc來(lái)申請(qǐng)空間,當(dāng)malloc申請(qǐng)空間成功時(shí)直接返回;申請(qǐng)空間失敗,
嘗試執(zhí)行空 間不足應(yīng)對(duì)措施,如果改應(yīng)對(duì)措施用戶設(shè)置了,則繼續(xù)申請(qǐng),否則拋異常。
*/
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
// 如果申請(qǐng)內(nèi)存失敗了,這里會(huì)拋出bad_alloc 類型異常
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
/*
operator delete: 該函數(shù)最終是通過(guò)free來(lái)釋放空間的
*/
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的實(shí)現(xiàn)
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

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

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

2.1內(nèi)置類型

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

2.2 自定義類型

new的原理

  • 調(diào)用operator new函數(shù)申請(qǐng)空間
  • 在申請(qǐng)的空間上執(zhí)行構(gòu)造函數(shù),完成對(duì)象的構(gòu)造

delete的原理

  • 在空間上執(zhí)行析構(gòu)函數(shù),完成對(duì)象中資源的清理工作
  • 調(diào)用operator delete函數(shù)釋放對(duì)象的空間

new T[N]的原理

  • 調(diào)用operator new[]函數(shù),在operator new[]中實(shí)際調(diào)用operator new函數(shù)完成N個(gè)對(duì)象空間的申請(qǐng)
  • 在申請(qǐng)的空間上執(zhí)行N次構(gòu)造函數(shù)

delete[]的原理

  • 在釋放的對(duì)象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個(gè)對(duì)象中資源的清理
  • 調(diào)用operator delete[]釋放空間,實(shí)際在operator delete[]中調(diào)用operator delete來(lái)釋放空間

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

相關(guān)文章

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

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

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

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

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

    Qt Design Studio安裝圖文教程

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

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

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

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

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

    基于C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)

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

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

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

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

    這篇文章主要介紹了對(duì)比分析C語(yǔ)言中的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常用新特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C語(yǔ)言 風(fēng)靡一時(shí)的黃金礦工游戲?qū)崿F(xiàn)流程詳解

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

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

最新評(píng)論

喀喇沁旗| 承德市| 嵩明县| 巨鹿县| 金山区| 米泉市| 合水县| 邻水| 冕宁县| 寻乌县| 普兰店市| 华蓥市| 光山县| 公安县| 洞口县| 涟水县| 西盟| 苗栗市| 公安县| 岑巩县| 读书| 晴隆县| 元朗区| 保康县| 通州区| 安新县| 虹口区| 黄浦区| 青岛市| 衡阳县| 秦安县| 仙居县| 乌兰浩特市| 亳州市| 佳木斯市| 阜阳市| 金沙县| 临桂县| 平顶山市| 珠海市| 晋宁县|