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

詳解C++動(dòng)態(tài)內(nèi)存管理

 更新時(shí)間:2023年05月19日 09:57:11   作者:函數(shù)指針  
這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存管理相關(guān)資料,文中示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++具有一定幫助,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)

1.c的動(dòng)態(tài)內(nèi)存管理

c語(yǔ)言的動(dòng)態(tài)內(nèi)存管理使用的函數(shù)為malloc/calloc/realloc/free

1.1 malloc/calloc/realloc

void Test ()
{
    int* p1 = (int*) malloc(sizeof(int));
    free(p1);
    // 1.malloc/calloc/realloc的區(qū)別是什么?
    int* p2 = (int*)calloc(4, sizeof (int));
    int* p3 = (int*)realloc(p2, sizeof(int)*10);
    // 這里需要free(p2)嗎?
    free(p3 );
}

malloc 和 calloc 都是動(dòng)態(tài)內(nèi)存申請(qǐng)函數(shù),不同點(diǎn)是:

  • malloc 和calloc 的參數(shù)不同,前者是申請(qǐng)的字節(jié)大小,后者為一個(gè)類型的大小和個(gè)數(shù),
  • malloc 不初始化,calloc 初始化
  • malloc 為內(nèi)存分配一塊,calloc 分配n快

realloc是用來(lái)擴(kuò)容的函數(shù),就是你malloc或calloc空間不夠的時(shí)候,使用realloc來(lái)增加空間的。

注意:realloc擴(kuò)容方式有兩種,第一種就是malloc之后,后邊的內(nèi)存依然足夠擴(kuò)容,那么realloc就在之前空間的后面擴(kuò)容,如果不夠,則再找一塊內(nèi)存空間,將之前的數(shù)據(jù)拷貝到realloc里面,再擴(kuò)容。

2.C++動(dòng)態(tài)內(nèi)存管理

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

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

int main()
{
	//text1();
	int* a1 = new int;//不初始化
	cout << *a1 << endl;
	delete a1;
	int* a2 = new int(1);//初始化為1
	cout << *a2 << endl;
	delete a2;
 
	int* a3 = new int[3]{1,2,3};//多次開(kāi)辟,初始化
	int i = 0;
	for (i=0;i<3;i++)
	{
		cout << a3[i] << endl;
	}
 
	delete[] a3;
 
	return 0;
}

注意:開(kāi)辟一個(gè)元素,delete不用加[],開(kāi)辟多個(gè)元素,delete一定要加[],不然會(huì)導(dǎo)致出現(xiàn)bug。

2.2 new/delete操作自定義類型

class sss
{
public:
	sss(int a=0,int b=0)
		:_a(a)
		,_b(b)
	{
		;
	}
	~sss()
	{
		_a = 0;
		_b = 0;
	}
 
private:
	int _a;
	int _b;
};
int main()
{
	//使用new
	sss* s1 = new sss[2]{ {1,1},{2,2} };
	delete[] s1;
	//使用malloc
	sss* s2 = (sss*)malloc(sizeof(sss)*2);
	free(s2);
	return 0;
}

注意:new/delete 和 malloc/free最大區(qū)別是 new/delete對(duì)于【自定義類型】除了開(kāi)空間還會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。且malloc不能初始化,new可以初始化,這是兩者最大的區(qū)別。

2.3 new底層原理

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 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)釋放空間的。

2.4  new 和 delete實(shí)現(xiàn)原理

  • 內(nèi)置類型和malloc基本一樣,不會(huì)有太大差別。不同的地方是:new/delete申請(qǐng)和釋放的是單個(gè)元素的空間,new[]和delete[]申請(qǐng)的是連續(xù)空間,而且new在申請(qǐng)空間失敗時(shí)會(huì)拋異常,malloc會(huì)返回NULL。
  • 自定義類型會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),malloc不會(huì)調(diào)用。

3.malloc/free和new/delete的區(qū)別

malloc/free和new/delete的共同點(diǎn)是:都是從堆上申請(qǐng)空間,并且需要用戶手動(dòng)釋放。不同的地方是:

  • 1. malloc和free是函數(shù),new和delete是操作符
  • 2. malloc申請(qǐng)的空間不會(huì)初始化,new可以初始化
  • 3. malloc申請(qǐng)空間時(shí),需要手動(dòng)計(jì)算空間大小并傳遞,new只需在其后跟上空間的類型即可,如果是多個(gè)對(duì)象,[]中指定對(duì)象個(gè)數(shù)即可
  • 4. malloc的返回值為void*, 在使用時(shí)必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類型
  • 5. malloc申請(qǐng)空間失敗時(shí),返回的是NULL,因此使用時(shí)必須判空,new不需要,但是new需要捕獲異常
  • 6. 申請(qǐng)自定義類型對(duì)象時(shí),malloc/free只會(huì)開(kāi)辟空間,不會(huì)調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請(qǐng)空間后會(huì)調(diào)用構(gòu)造函數(shù)完成對(duì)象的初始化,delete在釋放空間前會(huì)調(diào)用析構(gòu)函數(shù)完成空間中資源的清理。

以上就是詳解C++動(dòng)態(tài)內(nèi)存管理的詳細(xì)內(nèi)容,更多關(guān)于C++動(dòng)態(tài)內(nèi)存管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • win10中的dlib庫(kù)安裝過(guò)程

    win10中的dlib庫(kù)安裝過(guò)程

    這篇文章主要介紹了win10中dlib庫(kù)的安裝過(guò)程,本文通過(guò)實(shí)例圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 一文讀懂C++中Protobuf

    一文讀懂C++中Protobuf

    Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化、或者說(shuō)序列化,本文詳解了Protobuf的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易文本編譯器

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易文本編譯器

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易文本編譯器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    這篇文章主要為大家介紹了如何利用Matlab繪制超好看的旋轉(zhuǎn)九邊形。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C++中memcpy和memmove的區(qū)別總結(jié)

    C++中memcpy和memmove的區(qū)別總結(jié)

    這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個(gè)問(wèn)題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下
    2014-10-10
  • C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[十]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[十]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[十]...
    2007-02-02
  • C++獲取特定進(jìn)程CPU使用率的實(shí)現(xiàn)代碼

    C++獲取特定進(jìn)程CPU使用率的實(shí)現(xiàn)代碼

    寫一個(gè)小程序在后臺(tái)記錄每個(gè)進(jìn)程的CPU使用情況,揪出鎖屏后占用CPU的進(jìn)程,于是自己寫了一個(gè)C++類CPUusage,方便地監(jiān)視不同進(jìn)程的CPU占用情況。本人編程還只是個(gè)新手,如有問(wèn)題請(qǐng)多多指教
    2019-04-04
  • C/C++程序設(shè)計(jì)的基本概念詳解

    C/C++程序設(shè)計(jì)的基本概念詳解

    這篇文章主要介紹了C++程序設(shè)計(jì)的基本概念詳解,文中有非常詳細(xì)的C語(yǔ)言使用教程及相關(guān)基礎(chǔ)知識(shí),對(duì)正在學(xué)習(xí)c語(yǔ)言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • C++通信新特性協(xié)程詳細(xì)介紹

    C++通信新特性協(xié)程詳細(xì)介紹

    這篇文章主要給大家分享得是C++的特性協(xié)程Coroutine,下面文章內(nèi)容我們將來(lái)具體介紹什么是協(xié)程,協(xié)程得好處等知識(shí)點(diǎn),需要的朋友可以參考一下
    2022-10-10
  • C語(yǔ)言實(shí)現(xiàn)自行車存放管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)自行車存放管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論