国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】——內(nèi)存管理(new和delete)

這篇具有很好參考價(jià)值的文章主要介紹了【C++】——內(nèi)存管理(new和delete)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 前言

在學(xué)習(xí)C語言的時(shí)候,我們學(xué)習(xí)了動(dòng)態(tài)內(nèi)存管理,也就是在堆上動(dòng)態(tài)開辟一些內(nèi)存供我們使用,雖然C語言內(nèi)存管理的方法在C++中也可以使用,但還有一些地方是他無能為力的,所以我們今天來學(xué)習(xí)C++內(nèi)存管理的方式。

2. C/C++內(nèi)存分布

在學(xué)習(xí)內(nèi)存管理之前,我們先來認(rèn)識一下C/C++中程序內(nèi)存區(qū)域被劃分為哪些。

1.棧又叫堆棧,存儲非靜態(tài)局部變量 / 函數(shù)參數(shù) / 返回值等等,棧是向下增長的。
2.內(nèi)存映射段是高效的I / O映射方式,用于裝載一個(gè)共享的動(dòng)態(tài)內(nèi)存庫。用戶可使用系統(tǒng)接口創(chuàng)建共享共享內(nèi)存,做進(jìn)程間通信。
3.堆用于程序運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配,堆是可以上增長的。
4.數(shù)據(jù)段,存儲全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。
5.代碼段,存儲可執(zhí)行的代碼 / 只讀常量。

3. C語言動(dòng)態(tài)內(nèi)存管理方式

C語言中動(dòng)態(tài)內(nèi)存管理依靠的是4個(gè)函數(shù):malloc、realloc、calloc、free
這些函數(shù)具體的功能可以看博主之前發(fā)布的C語言動(dòng)態(tài)內(nèi)存管理文章,有詳細(xì)的講解

void Test()
{
	int* p1 = (int*)malloc(sizeof(int));
	free(p1);
	int* p2 = (int*)calloc(4, sizeof(int));
	int* p3 = (int*)realloc(p2, sizeof(int) * 10);
	//這里不需要free(p2)
	free(p3);
}

int main()
{
	Test();
	return 0;
}

4. C++內(nèi)存管理方式

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

而new和delete對于內(nèi)置類型和自定義類型有不同的處理方式,下面我們來學(xué)習(xí)new和delete分別對內(nèi)置類型和自定義類型的處理方式。

4.1 內(nèi)置類型

針對內(nèi)置類型,new/delete跟malloc/free沒有本質(zhì)的區(qū)別,只有用法的區(qū)別,new/delete的用法簡化了。

下面我們直接舉例說明new和delete針對內(nèi)置類型的用法。

void Test()
{
	//C語言
	//動(dòng)態(tài)申請一個(gè)int類型的空間
	int* p1 = (int*)malloc(sizeof(int));

	//C++
	//動(dòng)態(tài)申請一個(gè)int類型的空間
	int* p2 = new int;
	//申請5個(gè)int的數(shù)組
	int* p3 = new int[5];

	//申請1個(gè)int對象,初始化為5
	int* p4 = new int(5);

	//C++11支持new[] 用{}初始化  C++98不支持
	int* p5 = new int[5]{1,2,3};

	//C語言
	free(p1);

	//C++
	delete p2;
	delete[] p3;
	delete p4;
	delete[] p5;
}

int main()
{
	Test();
	return 0;
}

注意:申請和釋放單個(gè)元素的空間,使用new和delete操作符,申請和釋放連續(xù)的空間,使用new[]和delete[],一定要匹配起來使用。

4.2 自定義類型

在申請自定義類型的空間時(shí),new會(huì)調(diào)用構(gòu)造函數(shù),delete會(huì)調(diào)用析構(gòu)函數(shù),而malloc與free不會(huì)。

例如:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A():" << this << endl;
	}

	~A()
	{
		cout << "~A():" << this << endl;
	}

private:
	int _a;
};


int main()
{
	//C語言
	//malloc
	//在堆上申請空間
	A* p1 = (A*)malloc(sizeof(A));
	if (p1 == NULL)
	{
		perror("malloc fail\n");
		return 0;
	}

	//釋放空間
	free(p1);

	//C++
	//new
	//在堆上申請空間、調(diào)用構(gòu)造函數(shù)初始化
	//A* p2 = new A;
	A* p3 = new A(10);

	//調(diào)用析構(gòu)函數(shù)清理對象中的資源、釋放空間
	delete p3;

	return 0;
}

【C++】——內(nèi)存管理(new和delete)

總結(jié):new/delete和malloc/free最大區(qū)別是new/delete對于自定義類型除了開辟空間還會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),對于內(nèi)置類型這兩者幾乎是一樣的。

5. operator new與operator delete函數(shù)

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

operator new:
該函數(shù)實(shí)際通過malloc來申請空間,當(dāng)malloc申請空間成功時(shí)直接返回,申請空間失敗時(shí),就嘗試執(zhí)行空間不足的應(yīng)對措施,如果該應(yīng)對措施用戶已經(jīng)設(shè)置了,就繼續(xù)申請,否則拋異常。

operator delete:
該函數(shù)最終是通過free來釋放空間的。

6. new和delete的實(shí)現(xiàn)原理

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

自定義類型
new的原理
1.調(diào)用operator new函數(shù)申請空間
2.在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造
delete的原理
1.在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作
2.調(diào)用operator delete函數(shù)釋放對象的空間
new T[N]的原理
1.調(diào)用operator new[]函數(shù),在operator new[]中實(shí)際調(diào)用operator new函數(shù)完成N個(gè)對象空間的申請
2.在申請的空間上執(zhí)行N次構(gòu)造函數(shù)
delete[]的原理
1.在釋放的對象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個(gè)對象中資源的清理
2.調(diào)用operator delete[]釋放空間,實(shí)際在operator delete[]中調(diào)用operator delete函數(shù)來釋放空間

7. 定位new表達(dá)式(placement-new)

定位new表達(dá)式是在已分配的原始內(nèi)存空間中調(diào)用構(gòu)造函數(shù)初始化一個(gè)對象。
使用格式
new (place_address) type或者new (place_address) type(initializer - list)
place_address必須是一個(gè)指針,initializer - list是類型的初始化列表
使用場景
定位new表達(dá)式在實(shí)際中一般是配合內(nèi)存池使用。因?yàn)閮?nèi)存池分配出的內(nèi)存沒有初始化,所以如果是自定義類型的對象,需要使用new的定義表達(dá)式進(jìn)行顯示調(diào)構(gòu)造函數(shù)進(jìn)行初始化。

class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}

	~A()
	{
		cout << "~A():" << this << endl;
	}

private:
	int _a;
};

int main()
{
	A* p1 = new A;

	A* p2 = (A*)malloc(sizeof(A));
	if (p2 == nullptr)
	{
		perror("malloc fail");
		return 0;
	}

	//new(p2)A;
	new(p2)A(10);

	return 0;
}

8. 結(jié)尾

C++內(nèi)存管理的方式我們就學(xué)習(xí)到這里,在學(xué)習(xí)了new和delete之后,我們以后還是盡量使用new和delete,因?yàn)閚ew和delete比起malloc和free不僅簡潔了很多,而且還更加實(shí)用和智能了。
最后,感謝各位大佬的耐心閱讀和支持,覺得本篇文章寫的不錯(cuò)的朋友可以三連關(guān)注支持一波,如果有什么問題或者本文有錯(cuò)誤的地方大家可以私信我,也可以在評論區(qū)留言討論,再次感謝各位。文章來源地址http://www.zghlxwxcb.cn/news/detail-459099.html

到了這里,關(guān)于【C++】——內(nèi)存管理(new和delete)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++內(nèi)存管理(2)new、delete詳解

    C++內(nèi)存管理(2)new、delete詳解

    目錄 new operator(new操作) new類對象時(shí)加不加括號的差別 new工作任務(wù) delete工作任務(wù) new和delete 堆區(qū)空間操作(對比malloc和free) new和delete操作基本類型的空間 new和delete操作基本類型的數(shù)組 new和delete操作類的空間 new和delete操作對象數(shù)組 new內(nèi)存分配細(xì)節(jié)探秘 為什么要盡可能少的

    2024年02月09日
    瀏覽(23)
  • C++如何進(jìn)行內(nèi)存管理 (new、delete)

    C++如何進(jìn)行內(nèi)存管理 (new、delete)

    我成功是因?yàn)槲矣袥Q心,從不躊躇?!闷苼? 本章是關(guān)于c++內(nèi)存管理的文章,字?jǐn)?shù)不多,內(nèi)容簡單,希望對你有所幫助??! 話不多說安全帶系好,發(fā)車?yán)?(建議電腦觀看) 。 附:紅色,部分為重點(diǎn)部分;藍(lán)顏色為需要記憶的部分(不是死記硬背哈,多敲);黑色加粗或

    2024年02月08日
    瀏覽(58)
  • 【C++破局】C++內(nèi)存管理之new與deleted剖析

    【C++破局】C++內(nèi)存管理之new與deleted剖析

    ??lovewold少個(gè)r博客主頁 ? ? ?? 本文重點(diǎn) : c++內(nèi)存管理部分知識點(diǎn)梳理 ?? 【C-C++入門系列專欄】 : 博客文章專欄傳送門 ?? 每日一言 :花有重開日,人無再少年! C/C++的內(nèi)存分配機(jī)制 內(nèi)存分區(qū) 1. 內(nèi)核空間(Kernel Space): 2. 棧空間(Stack): 3. 內(nèi)存映射段(Memory Mapp

    2024年02月05日
    瀏覽(25)
  • 【C++】C/C++內(nèi)存管理-new、delete

    【C++】C/C++內(nèi)存管理-new、delete

    ヾ(????)?\\\" 人總要為過去的懶惰而付出代價(jià) ヾ(????)?\\\" 代碼展示: 棧區(qū) :局部變量 sizeof(數(shù)組名):整個(gè)數(shù)組的大小 sizeof(字符串):注意‘\\0’ 棧又叫堆棧–非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等等,棧是向下增長的。 內(nèi)存映射段是高效的I/O映射方式,用于裝載

    2024年02月11日
    瀏覽(20)
  • 【C++初階】七、內(nèi)存管理(C/C++內(nèi)存分布、C++內(nèi)存管理方式、operator new / delete 函數(shù)、定位new表達(dá)式)

    【C++初階】七、內(nèi)存管理(C/C++內(nèi)存分布、C++內(nèi)存管理方式、operator new / delete 函數(shù)、定位new表達(dá)式)

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【C++初階】六、類和對象(初始化列表、static成員、友元、內(nèi)部類)-CSDN博客 ?==================

    2024年02月05日
    瀏覽(23)
  • 【C++入門】new和delete(C/C++內(nèi)存管理)

    【C++入門】new和delete(C/C++內(nèi)存管理)

    1.C/C++內(nèi)存分布 我們先來看一個(gè)小問題: 問題: 下面我們就來簡單分析一下: 首先 globalVar 是一個(gè)全局變量,其次 staticGlobalVar 是一個(gè)靜態(tài)全局變量, staticVar 是靜態(tài)局部變量,都在靜態(tài)區(qū)(數(shù)據(jù)段)。最后 localVar 是個(gè)局部變量, num1 是個(gè)整型數(shù)組,那它們是在棧上的。 ch

    2024年02月11日
    瀏覽(19)
  • 【C++干貨基地】深度理解C++中的高效內(nèi)存管理方式 new & delete

    【C++干貨基地】深度理解C++中的高效內(nèi)存管理方式 new & delete

    ?? 鴿芷咕 :個(gè)人主頁 ??? 個(gè)人專欄 : 《C++干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! ??哈嘍各位鐵汁們好啊,我是博主鴿芷咕《C++干貨基地》是由我的襄陽家鄉(xiāng)零食基地有感而發(fā),不知道各位的城市有沒有這種實(shí)惠又全面的零食基地呢?C++ 本身作

    2024年04月26日
    瀏覽(36)
  • 【C++庖丁解?!緾++內(nèi)存管理 | new和delete的使用以及使用原理

    【C++庖丁解?!緾++內(nèi)存管理 | new和delete的使用以及使用原理

    ?? 作者簡介 :RO-BERRY ?? 學(xué)習(xí)方向:致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫等等一系列知識 ?? 日后方向 : 偏向于CPP開發(fā)以及大數(shù)據(jù)方向,歡迎各位關(guān)注,謝謝各位的支持 我們先來看下面的一段代碼和相關(guān)問題 選擇題: 選項(xiàng): A.棧 B.堆 C.數(shù)據(jù)段(靜態(tài)區(qū)) D.代碼段(常量區(qū))

    2024年03月09日
    瀏覽(21)
  • C/C++內(nèi)存管理(含C++中new和delete的使用)

    C/C++內(nèi)存管理(含C++中new和delete的使用)

    我們先來看下面的一段代碼和相關(guān)問題。 說明 : 棧 又叫堆棧– 非靜態(tài)局部變量/函數(shù)參數(shù)/返回值 等等,棧是向下增長的。 內(nèi)存映射段 是高效的 I/O 映射方式,用于裝載一個(gè)共享的動(dòng)態(tài)內(nèi)存庫。用戶可使用系統(tǒng)接口創(chuàng)建共享共享內(nèi)存,做進(jìn)程間通信。( Linux 課程如果沒學(xué)到

    2024年02月05日
    瀏覽(27)
  • 【C++】深入探討內(nèi)存管理:malloc/free與new/delete的區(qū)別以及如何避免內(nèi)存泄漏

    在軟件開發(fā)中,正確處理內(nèi)存管理是至關(guān)重要的一環(huán)。在C++編程中,我們經(jīng)常會(huì)用到動(dòng)態(tài)內(nèi)存管理的工具,比如 malloc/free 和 new/delete 。本文將深入探討 malloc/free 與 new/delete 之間的區(qū)別,以及如何有效地避免內(nèi)存泄漏問題。 都是用于從堆上申請空間,并需要手動(dòng)釋放。 mallo

    2024年02月22日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包