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

C++深入講解new與deleted關(guān)鍵字的使用

 更新時(shí)間:2022年05月21日 09:48:28   作者:Mi ronin  
這篇文章主要介紹了C++中new與deleted關(guān)鍵字的使用,new在動(dòng)態(tài)內(nèi)存中為對(duì)象分配空間并返回一個(gè)指向該對(duì)象的指針;delete接受一個(gè)動(dòng)態(tài)對(duì)象的指針, 銷毀該對(duì)象, 并釋放與之關(guān)聯(lián)的內(nèi)存

可執(zhí)行程序的虛擬地址空間

  1. 內(nèi)核:存放操作系統(tǒng)
  2. 棧區(qū):函數(shù)的形參,非靜態(tài)的局部變量,函數(shù)現(xiàn)場(chǎng) 保護(hù)數(shù)據(jù)等等,棧是向下增長(zhǎng)的。
  3. 共享庫(kù)的內(nèi)存映射區(qū)域:用于裝載一個(gè)共享的動(dòng)態(tài)內(nèi)存庫(kù)。用戶可使用系統(tǒng)接口創(chuàng)建共享內(nèi)存,做進(jìn)程間通信。
  4. 堆區(qū):用于程序運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配,堆是可以上增長(zhǎng)的。
  5. 數(shù)據(jù):存儲(chǔ)全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù),分為.bss和.data 。
  6. 代碼:可執(zhí)行的程序(機(jī)器指令)和常量數(shù)據(jù)。

1.new的運(yùn)算符用法(關(guān)鍵字)

int* p= new int(10);

這里的new的用法是當(dāng)作運(yùn)算符的用法,該用法一共有四個(gè)步驟:

  1. 計(jì)算類型
  2. 申請(qǐng)一個(gè)空間(因?yàn)閚ew的底層是malloc)
  3. 將所取得的空間初始化
  4. 將申請(qǐng)到的地址返回

2.new的函數(shù)用法

new當(dāng)作函數(shù)用法使用的是時(shí)候,類似malloc,都是申請(qǐng)一個(gè)空間,區(qū)別在于,返回值不同;當(dāng)空間不足時(shí)malloc會(huì)返回一個(gè)“nullptr”,operator new會(huì)返回一個(gè)throw_bad的異常。

當(dāng)我們加入一個(gè)nothrow后:

這樣申請(qǐng)錯(cuò)誤后,我們返回的是空指針。

對(duì)于malloc我們不可以進(jìn)行初始化,new也不可以初始化。

所以當(dāng)new作為函數(shù)時(shí)就相當(dāng)于malloc。

3.定位new

定位new用法與構(gòu)造new十分相似,是在已經(jīng)確定的空間當(dāng)中,構(gòu)造一個(gè)對(duì)象,并將該對(duì)象放置到聲明的空間當(dāng)中。

int main()
{
	int n = 10;
	int* ipa = (int*)ma11oc(sizeof(int));
	int* ipb = (int*) : :operator new(sizeof(int) * n);
	new(ipa) int(20);
	new(ipb) int[]{ 1,2,3,4,5,6,7,8,9 };
	free(ipa);
	: :operator delete(ipb);
	return 0;
}

不需要開(kāi)辟相應(yīng)的空間 合法空間即可 給出某個(gè)地址 即可根據(jù)要求進(jìn)行相應(yīng)操作。

4.new創(chuàng)建對(duì)象

new創(chuàng)建對(duì)象特點(diǎn):

  1. new創(chuàng)建對(duì)象需要指針接收,一處初始化,多處使用。
  2. new創(chuàng)建對(duì)象使用完需delete銷毀。
  3. new創(chuàng)建對(duì)象直接使用堆空間,而局部不用new定義對(duì)象則使用??臻g。
  4. new對(duì)象指針用途廣泛,比如作為函數(shù)返回值、函數(shù)參數(shù)等。
  5. 頻繁調(diào)用場(chǎng)合并不適合new,就像new申請(qǐng)和釋放內(nèi)存一樣。

new創(chuàng)建對(duì)象例子:

CTest*  pTest = new  CTest();
delete pTest;

pTest用來(lái)接收對(duì)象指針。

不用new,直接使用類定義申明:

CTest  mTest;

此種創(chuàng)建方式,使用完后不需要手動(dòng)釋放,該類析構(gòu)函數(shù)會(huì)自動(dòng)執(zhí)行。

而new申請(qǐng)的對(duì)象,則只有調(diào)用到delete時(shí)再會(huì)執(zhí)行析構(gòu)函數(shù),如果程序退出而沒(méi)有執(zhí)行delete則會(huì)造成內(nèi)存泄漏。

C Test*  pTest = NULL;

但使用普通方式創(chuàng)建的類對(duì)象,在創(chuàng)建之初就已經(jīng)分配了內(nèi)存空間。

這類指針,如果未經(jīng)過(guò)對(duì)象初始化,則不需要delete釋放。

5.delete

delete運(yùn)算符使用的一般格式為

 delete [ ]指針變量

例如要撤銷上面用new開(kāi)辟的空間用:

delete p; 

如果我們用“new char[10];”開(kāi)辟的字符數(shù)組空間,把new返回的指針賦給了指針變量pt,則應(yīng)該用以下形式的delete運(yùn)算符撤銷該空間:

  delete [] pt;

一般來(lái)說(shuō)delete與new需要配對(duì)使用。

6.對(duì)于內(nèi)置類型new/delete/malloc/free可以混用

  1. new/delete是C++中的運(yùn)算符。malloc / free是函數(shù)。
  2. malloc申請(qǐng)內(nèi)存空間時(shí),手動(dòng)計(jì)算所需大小,new只需類型名,自動(dòng)計(jì)算大小;
  3. malloc申請(qǐng)的內(nèi)存空間不會(huì)初始化,new可以初始化;
  4. malloc的返回值為void*,接收時(shí)必須強(qiáng)轉(zhuǎn),new不需要;
  5. malloc申請(qǐng)內(nèi)存空間失敗時(shí),返回的是NULL,使用時(shí)必須判空;new申請(qǐng)內(nèi)存空間失敗時(shí)返回異常

7.使用注意事項(xiàng)

動(dòng)態(tài)分配失敗,則返回一個(gè)空指針(NULL),表示發(fā)生了異常,堆資源不足,分配失敗。

指針刪除與堆空間釋放。刪除一個(gè)指針p(delete p;)實(shí)際意思是刪除了p所指的目標(biāo)(變量或?qū)ο蟮龋?,釋放了它所占的堆空間,而不是刪除p本身(指針p本身并沒(méi)有撤銷,它自己仍然存在,該指針?biāo)純?nèi)存空間并未釋放),釋放堆空間后,p成了空指針。

內(nèi)存泄漏(memory leak)和重復(fù)釋放。new與delete 是配對(duì)使用的, delete只能釋放堆空間。如果new返回的指針值丟失,則所分配的堆空間無(wú)法回收,稱內(nèi)存泄漏,同一空間重復(fù)釋放也是危險(xiǎn)的,因?yàn)樵摽臻g可能已另分配,所以必須妥善保存new返回的指針,以保證不發(fā)生內(nèi)存泄漏,也必須保證不會(huì)重復(fù)釋放堆內(nèi)存空間。

動(dòng)態(tài)分配的變量或?qū)ο蟮纳?。我們也稱堆空間為自由空間(free store),但必須記住釋放該對(duì)象所占堆空間,并只能釋放一次,在函數(shù)內(nèi)建立,而在函數(shù)外釋放,往往會(huì)出錯(cuò)。

要訪問(wèn)new所開(kāi)辟的結(jié)構(gòu)體空間,無(wú)法直接通過(guò)變量名進(jìn)行,只能通過(guò)賦值的指針進(jìn)行訪問(wèn)。

用new和delete可以動(dòng)態(tài)開(kāi)辟和撤銷地址空間。在編程序時(shí),若用完一個(gè)變量(一般是暫時(shí)存儲(chǔ)的數(shù)據(jù)),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開(kāi)始使用時(shí)開(kāi)辟一個(gè)空間,在用完后撤銷它。

到此這篇關(guān)于C++深入講解new與deleted關(guān)鍵字的使用的文章就介紹到這了,更多相關(guān)C++ new與deleted內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解

    史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解

    這篇文章主要介紹了史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解,本文通過(guò)代碼演示給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 詳解C語(yǔ)言中for循環(huán)與while循環(huán)的用法

    詳解C語(yǔ)言中for循環(huán)與while循環(huán)的用法

    這篇文章主要通過(guò)幾個(gè)示例為大家介紹一下C語(yǔ)言中for循環(huán)與while循環(huán)的用法以及二者的區(qū)別,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-07-07
  • C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題

    C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題

    這篇文章主要介紹了C語(yǔ)言之地址傳遞和引用傳遞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一文帶你掌握C++中的繼承

    一文帶你掌握C++中的繼承

    繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,本文詳解介紹了C++中的繼承,感興趣的同學(xué)可以借鑒一下
    2023-05-05
  • QT使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能

    QT使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能

    模糊查詢是指根據(jù)用戶輸入的文本,在下拉框的選項(xiàng)中進(jìn)行模糊匹配,并動(dòng)態(tài)地顯示匹配的選項(xiàng),本文將使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能,需要的可以參考下
    2023-11-11
  • 淺談C++11中=delete的巧妙用法

    淺談C++11中=delete的巧妙用法

    本文主要介紹了C++11中=delete的巧妙用法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言 指針與二維數(shù)組詳解

    C語(yǔ)言 指針與二維數(shù)組詳解

    本文主要介紹C語(yǔ)言 指針與二維數(shù)組,這里整理了詳細(xì)的資料及示例代碼,有需要的小伙伴可以參考下
    2016-08-08
  • 面試題快慢鏈表和快慢指針

    面試題快慢鏈表和快慢指針

    這篇文章主要介紹了面試題快慢鏈表和快慢指針的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言詳細(xì)講解指針數(shù)組的用法

    C語(yǔ)言詳細(xì)講解指針數(shù)組的用法

    在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-05-05
  • C語(yǔ)言位運(yùn)算和sizeof運(yùn)算符詳解

    C語(yǔ)言位運(yùn)算和sizeof運(yùn)算符詳解

    這篇文章主要介紹了C語(yǔ)言位運(yùn)算和sizeof運(yùn)算符詳解的相關(guān)資料,這里提供了詳細(xì)的知識(shí)要點(diǎn),并附簡(jiǎn)單代碼示例,需要的朋友可以參考下
    2016-11-11

最新評(píng)論

盈江县| 延庆县| 呼图壁县| 越西县| 舒城县| 射洪县| 天峻县| 原平市| 青浦区| 陕西省| 昌都县| 茌平县| 昌黎县| 河池市| 唐河县| 古田县| 宁城县| 犍为县| 门头沟区| 汝城县| 黄石市| 高清| 会同县| 新乐市| 大埔县| 灵寿县| 灵璧县| 栾城县| 凌源市| 九龙坡区| 肥东县| 大冶市| 盐津县| 连山| 通州区| 金湖县| 姜堰市| 淮安市| 玉环县| 延寿县| 大理市|