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

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

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


緒論

我成功是因?yàn)槲矣袥Q心,從不躊躇。——拿破侖?

本章是關(guān)于c++內(nèi)存管理的文章,字?jǐn)?shù)不多,內(nèi)容簡(jiǎn)單,希望對(duì)你有所幫助!!

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

話不多說(shuō)安全帶系好,發(fā)車(chē)?yán)?strong>(建議電腦觀看)。


附:紅色,部分為重點(diǎn)部分;藍(lán)顏色為需要記憶的部分(不是死記硬背哈,多敲);黑色加粗或者其余顏色為次重點(diǎn);黑色為描述需要


思維導(dǎo)圖:

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

要XMind思維導(dǎo)圖的話可以私信哈


目錄

緒論

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

2.c++中的內(nèi)存管理方式(new 、 delete)

3.new 和 delete 的底層

4.malloc 、free 與 new 、delete 的區(qū)別:


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

知識(shí)點(diǎn):

C/C++中的程序內(nèi)存分布的區(qū)域主要有:
內(nèi)核空間,棧,堆,內(nèi)存映射區(qū),靜態(tài)區(qū)(數(shù)據(jù)段),常量區(qū)(代碼段)。

細(xì)節(jié):

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

如下圖:

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

練習(xí):

//分析下面數(shù)據(jù)在內(nèi)存的哪一個(gè)區(qū)域
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
const char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
//此處并不需要對(duì)ptr2進(jìn)行釋放,因?yàn)槠渲赶虻目臻g可能和ptr3一樣,釋放ptr3即可
free(ptr3);
}

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


2.c++中的內(nèi)存管理方式(new 、 delete)

知識(shí)點(diǎn):

我們?cè)贑語(yǔ)言中已經(jīng)學(xué)過(guò)如何開(kāi)辟內(nèi)存(malloc 、 calloc 、 realloc)、和釋放內(nèi)存(free)了,但是其實(shí)用起來(lái)并不太方便(在我們申請(qǐng)后還需要去判斷是否申請(qǐng)成功)

所以在c++中進(jìn)行了一定的改變創(chuàng)建了new,原理一樣也是向堆上去申請(qǐng)空間,但是此時(shí)如果未申請(qǐng)成功的話,他會(huì)直接報(bào)錯(cuò),而不是返回一個(gè)NULL(這主要是因?yàn)閏++是面向?qū)ο蟮亩鳦語(yǔ)言是面向過(guò)程的)

細(xì)節(jié):

具體使用方法(語(yǔ)法):

  1. 類(lèi)型 * ptr = new 類(lèi)型;(申請(qǐng)類(lèi)型大小的空間)

delete ptr; (釋放)

類(lèi)型 * ptr =? new 類(lèi)型[n] (申請(qǐng)類(lèi)型大小的n個(gè)空間)

delete[] ptr; (釋放)

-----------------------------------------------------------------------

  1. 對(duì)申請(qǐng)的空間進(jìn)行初始化

類(lèi)型 * ptr =?new 類(lèi)型(n) (對(duì)申請(qǐng)的內(nèi)存初始化為n)

類(lèi)型 * ptr = new 類(lèi)型[n]{a,b,c ...} (對(duì)申請(qǐng)的多個(gè)空間進(jìn)行按順序初始化為 a 、b 、c .... 不寫(xiě)則初始化為0)

c++與C語(yǔ)言的對(duì)比以及一些更加詳細(xì)的細(xì)節(jié)如下代碼的注釋中(很重要一定要細(xì)看):

 #define _CRT_SECURE_NO_WARNINGS 1
#include<stdlib.h>
int main()
{
	//c:
	int* ptr1 = (int*)malloc(sizeof(int));
	free(ptr1);

	//c++:
	int* ptr2 = new int;//此時(shí)和上面的申請(qǐng)的空間是一樣的其大小也是一個(gè)整形的大小
	delete ptr2;//釋放也是一樣

	//c:
	int* ptr3 = (int*)malloc(sizeof(int) * 10);
	free(ptr3);

	//c++:
	int* ptr4 = new int[10];//此時(shí)和上面的申請(qǐng)的空間是一樣也是10個(gè)整形的大小
	delete[] ptr4;

	//c:
	//malloc不會(huì)進(jìn)行初始化,我們只能另寫(xiě)一個(gè)程序進(jìn)行初始化

	//c++:
	//c++就能直接在申請(qǐng)空間的同時(shí)進(jìn)行初始化工作
	//具體如:
	int* ptr5 = new int(10);//注意這里時(shí)圓括號(hào) , 和創(chuàng)建多個(gè)對(duì)象的方括號(hào)不一樣
	delete ptr5;

	//對(duì)申請(qǐng)多個(gè)空間的也能進(jìn)行初始化
	int* ptr6 = new int[10]{};//用中括號(hào)進(jìn)行初始化,什么都不寫(xiě)時(shí)表示申請(qǐng)的空間初始化為0
	delete[] ptr6;

	int* ptr7 = new int[10]{1,2,3};//部分初始化,剩下沒(méi)寫(xiě)的初始化為0
	delete[] ptr7;

 	A* ptr8 = new A[3];//此處假如A類(lèi)型沒(méi)有默認(rèn)構(gòu)造的話是不行的,反之則可以
	delete[] ptr8;

	A* ptr9 = new A[3]{1,2,3};//支持隱式類(lèi)型轉(zhuǎn)換拷貝構(gòu)造后在構(gòu)造
	delete[] ptr9;

	A* ptr10 = new A[3]{ A(1),A(2),A(3) };//此時(shí)就沒(méi)有隱式類(lèi)型轉(zhuǎn)換了,直接進(jìn)行構(gòu)造
	delete[] ptr10;

	return 0;
}

練習(xí):

創(chuàng)建節(jié)點(diǎn)ListCode:

class ListCode
{
public:
	ListCode(int val = 0)
		:val(val)
		,next(nullptr)
	{
	}
private:
	int val;
	struct ListCode* next;
};
int main()
{
	//在C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中我們可能還需要去寫(xiě)一個(gè)ListCode()的創(chuàng)建節(jié)點(diǎn)的函數(shù)
	//但此時(shí)我們可以直接寫(xiě)成如下模樣

	ListCode* n1 = new ListCode(1);//還進(jìn)行了構(gòu)造
	ListCode* n2 = new ListCode(2);

	return 0;
}

3.new 和 delete 的底層原理

知識(shí)點(diǎn):

new 和 delete 他們的底層原理其實(shí)也是需要去調(diào)用了 malloc 和 free 不過(guò)因?yàn)槊嫦驅(qū)ο蟮脑?,他們一般來(lái)說(shuō)都是直接拋異常 , 所以在使用malloc 和 free 之前他們需要先去調(diào)用一個(gè)全局函數(shù) 分別是 operator new 和 operator delete?

異常錯(cuò)誤信息(此時(shí)申請(qǐng)不到空間了):C++如何進(jìn)行內(nèi)存管理 (new、delete)

細(xì)節(jié):

  1. operator 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)釋放空間。而其實(shí)operator new 和 operator delete 他們都會(huì)去調(diào)用 malloc 和 free 并且 如果失敗時(shí) 就會(huì)再自身里面識(shí)別并且報(bào)錯(cuò)錯(cuò)誤信息
  2. 針對(duì)自定義類(lèi)時(shí) : new 和 delete 他們其實(shí)還會(huì)去調(diào)用 構(gòu)造函數(shù) 和 析構(gòu)函數(shù) , 來(lái)進(jìn)行對(duì)其中的數(shù)據(jù)的初始化和銷(xiāo)毀
  3. new 調(diào)用的順序?yàn)椋簅perator new -> 構(gòu)造函數(shù) 、 delete 調(diào)用順序?yàn)?: 析構(gòu)函數(shù) -> operator delete? , 并且注意他們的順序是不能改變的 , 因?yàn)?析構(gòu)函數(shù)需要先把對(duì)象中申請(qǐng)的空間給釋放了 , 然后才能把這個(gè)new借的空間釋放掉(反過(guò)來(lái)先把new的空間釋放的話就找不到對(duì)象已經(jīng)對(duì)象中申請(qǐng)的空間了); 同理 對(duì)于new 來(lái)說(shuō)得先為 對(duì)象 申請(qǐng)空間后(創(chuàng)建對(duì)象)?才能在對(duì)象的 空間上申請(qǐng)其他的空間?C++如何進(jìn)行內(nèi)存管理 (new、delete)
  4. 綜上所述得出下圖:C++如何進(jìn)行內(nèi)存管理 (new、delete)
  5. 對(duì)于 new int[ ] , delete[] ptr? 他們會(huì)先調(diào)用 operator new[] 然后再調(diào)用n次operator new 和n次構(gòu)造函數(shù), delete 類(lèi)似
  6. 附:捕獲異常的方法
    	int* ptr = nullptr;
    	try
    	{
    		do
    		{
    			ptr = new int[1024 * 1024];
    			cout << ptr << endl;
    		} while (ptr);
    	}
    	catch (const exception& e )
    	{
    		cout << e.what() << endl;
    	}
    
    // try 
    //{}
    //catch(const exception& e)
    //{
    //    cout <<e.what()<<endl;
    //}

附:定位new

功能:定位new表達(dá)式是在已分配的原始內(nèi)存空間中調(diào)用構(gòu)造函數(shù)初始化一個(gè)對(duì)象

使用格式 :?new (place_address) type或者new (place_address) type(initializer-list)
place_address必須是一個(gè)指針,initializer-list是類(lèi)型的初始化列表

用處:可以用于池化技術(shù)處,也就是操作系統(tǒng)會(huì)先創(chuàng)建一個(gè)內(nèi)存池,里面已經(jīng)提前申請(qǐng)了一定的空間,此時(shí)我們就能更方便的去申請(qǐng)空間,而不是需要了去申請(qǐng),需要了去申請(qǐng),這里申請(qǐng)到的空間自然就不會(huì)進(jìn)行構(gòu)造函數(shù)初始化,所以我們就能使用定位new的方式對(duì)已申請(qǐng)的空間進(jìn)行初始化

具體使用方法:

int main()
{
    // p1現(xiàn)在指向的只不過(guò)是與A對(duì)象相同大小的一段空間,還不能算是一個(gè)對(duì)象,因?yàn)闃?gòu)造函數(shù)沒(méi)有執(zhí)行
    A* p1 = (A*)malloc(sizeof(A));
    new(p1)A; // 注意:如果A類(lèi)的構(gòu)造函數(shù)有參數(shù)時(shí),此處需要傳參
    p1->~A();
    free(p1);
    return 0;
}

4.malloc 、free 與 new 、delete 的區(qū)別:

知識(shí)點(diǎn):

  1. 首先new是基于c++面向?qū)ο蟮那闆r而創(chuàng)建的,所以在我們申請(qǐng)不到空間時(shí)是進(jìn)行拋出異常,而malloc則是面向過(guò)程的,當(dāng)申請(qǐng)不到空間時(shí)返回一個(gè)空指針
  2. 其次new要比malloc寫(xiě)起來(lái)更加的快捷,他不用再進(jìn)行類(lèi)型大小的計(jì)算,以及有著更加方便的初始方式
  3. 最后也是最重要的部分,new 和 delete 是針對(duì)自定義類(lèi)型而創(chuàng)建的他們能很好的去進(jìn)行初始化自定義類(lèi)型,并且在申請(qǐng)、釋放空間的過(guò)程還進(jìn)行了構(gòu)造和析構(gòu)函數(shù)的調(diào)用
  4. 附:malloc和free是函數(shù),new和delete是操作符、malloc的返回值為void*, 在使用時(shí)必須強(qiáng)轉(zhuǎn)、malloc申請(qǐng)空間失敗時(shí),返回的是NULL,因此使用時(shí)必須判空
    ?

本章完。預(yù)知后事如何,暫聽(tīng)下回分解。

如果有任何問(wèn)題歡迎討論哈!

如果覺(jué)得這篇文章對(duì)你有所幫助的話點(diǎn)點(diǎn)贊吧!

持續(xù)更新大量C++細(xì)致內(nèi)容,早關(guān)注不迷路。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-478239.html

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

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

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

相關(guān)文章

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

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

    在學(xué)習(xí)C語(yǔ)言的時(shí)候,我們學(xué)習(xí)了動(dòng)態(tài)內(nèi)存管理,也就是在堆上動(dòng)態(tài)開(kāi)辟一些內(nèi)存供我們使用,雖然C語(yǔ)言內(nèi)存管理的方法在C++中也可以使用,但還有一些地方是他無(wú)能為力的,所以我們今天來(lái)學(xué)習(xí)C++內(nèi)存管理的方式。 在學(xué)習(xí)內(nèi)存管理之前,我們先來(lái)認(rèn)識(shí)一下C/C++中程序內(nèi)存區(qū)

    2024年02月06日
    瀏覽(26)
  • C++內(nèi)存管理(new和delete)

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

    目錄 1. new/delete操作內(nèi)置類(lèi)型 2. new和delete操作自定義類(lèi)型 3. operator new與operator delete函數(shù)? 4 .new和delete的實(shí)現(xiàn)原理 1 .內(nèi)置類(lèi)型 2 .自定義類(lèi)型 new的原理 delete的原理 new T[N]的原理 delete[]的原理 5. 定位new表達(dá)式(placement-new) 6. malloc/free和new/delete的區(qū)別 7.內(nèi)存泄漏 內(nèi)存泄漏分類(lèi) 8.如

    2024年02月02日
    瀏覽(18)
  • C++內(nèi)存管理(2)new、delete詳解

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

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

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

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

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

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

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

    ヾ(????)?\\\" 人總要為過(guò)去的懶惰而付出代價(jià) ヾ(????)?\\\" 代碼展示: 棧區(qū) :局部變量 sizeof(數(shù)組名):整個(gè)數(shù)組的大小 sizeof(字符串):注意‘\\0’ 棧又叫堆棧–非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等等,棧是向下增長(zhǎng)的。 內(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語(yǔ)言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【C++初階】六、類(lèi)和對(duì)象(初始化列表、static成員、友元、內(nèi)部類(lèi))-CSDN博客 ?==================

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

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

    1.C/C++內(nèi)存分布 我們先來(lái)看一個(gè)小問(wèn)題: 問(wèn)題: 下面我們就來(lái)簡(jiǎn)單分析一下: 首先 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è)人主頁(yè) ??? 個(gè)人專(zhuān)欄 : 《C++干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! ??哈嘍各位鐵汁們好啊,我是博主鴿芷咕《C++干貨基地》是由我的襄陽(yáng)家鄉(xiāng)零食基地有感而發(fā),不知道各位的城市有沒(méi)有這種實(shí)惠又全面的零食基地呢?C++ 本身作

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

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

    ?? 作者簡(jiǎn)介 :RO-BERRY ?? 學(xué)習(xí)方向:致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫(kù)等等一系列知識(shí) ?? 日后方向 : 偏向于CPP開(kāi)發(fā)以及大數(shù)據(jù)方向,歡迎各位關(guān)注,謝謝各位的支持 我們先來(lái)看下面的一段代碼和相關(guān)問(wè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的使用)

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

    2024年02月05日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包