欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

C語言內(nèi)存管理方式在C++中可以繼續(xù)使用,但有些地方就無能為力而且使用起來比較麻煩,因此C++又提出了自己的內(nèi)存管理方式:通過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ù)來申請(qǐng)空間,delete在底層通過operator delete全局函數(shù)來釋放空間。

/*
operator new:該函數(shù)實(shí)際通過malloc來申請(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ù)最終是通過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的實(shí)現(xiàn)
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

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

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

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

相關(guān)文章

  • C語言行優(yōu)先和列優(yōu)先的問題深入分析

    C語言行優(yōu)先和列優(yōu)先的問題深入分析

    這篇文章主要介紹了C語言行優(yōu)先和列優(yōu)先的問題深入分析的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Qt實(shí)現(xiàn)界面滑動(dòng)切換效果的思路詳解

    Qt實(shí)現(xiàn)界面滑動(dòng)切換效果的思路詳解

    這篇文章主要介紹了Qt實(shí)現(xiàn)界面滑動(dòng)切換效果,主要包括設(shè)計(jì)思路及主要函數(shù)講解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • linux c++模擬簡易網(wǎng)絡(luò)爬蟲實(shí)例

    linux c++模擬簡易網(wǎng)絡(luò)爬蟲實(shí)例

    下面小編就為大家?guī)硪黄猯inux c++模擬簡易網(wǎng)絡(luò)爬蟲實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++使用HTTP庫和框架輕松發(fā)送HTTP請(qǐng)求

    C++使用HTTP庫和框架輕松發(fā)送HTTP請(qǐng)求

    使用C++編程發(fā)送HTTP請(qǐng)求通常需要使用第三方的HTTP庫或框架,本文主要介紹了C++使用HTTP庫和框架輕松發(fā)送HTTP請(qǐng)求,感興趣的可以了解一下
    2023-12-12
  • 文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    以下是對(duì)文件編譯時(shí)出現(xiàn)multiple definition of 'xxxxxx'的解決方法進(jìn)行了詳細(xì)的分析介紹,如也遇到此問題的朋友們可以過來參考下
    2013-07-07
  • C++超詳細(xì)講解友元的使用

    C++超詳細(xì)講解友元的使用

    采用類的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-04-04
  • 淺談c++調(diào)用python鏈接的問題及解決方法

    淺談c++調(diào)用python鏈接的問題及解決方法

    下面小編就為大家?guī)硪黄獪\談c++調(diào)用python鏈接的問題及解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 學(xué)生信息管理系統(tǒng)C語言版

    學(xué)生信息管理系統(tǒng)C語言版

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言音樂播放器實(shí)例代碼

    C語言音樂播放器實(shí)例代碼

    文章給大家分享了用C語言音樂播放器的實(shí)例代碼,對(duì)此有需要的朋友參考學(xué)習(xí)下。
    2018-07-07
  • C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解

    C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中,ComboBox(組合框)是一種常用的用戶界面控件,它提供了一個(gè)下拉列表,允許用戶從預(yù)定義的選項(xiàng)中選擇一個(gè),本文給大家介紹QComboBox類的一些常用方法,需要的朋友可以參考下
    2023-12-12

最新評(píng)論