日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C++ > 正文

淺談 C++ 中的 new/delete 和 new[]/delete[]

2019-11-06 06:11:14
字體:
來源:轉載
供稿:網(wǎng)友

原始出處:http://www.cnblogs.com/hazir/p/new_and_delete.html

在 C++ 中,你也許經(jīng)常使用 new 和 delete 來動態(tài)申請和釋放內(nèi)存,但你可曾想過以下問題呢?

new 和 delete 是函數(shù)嗎?new [] 和 delete [] 又是什么?什么時候用它們?你知道 Operator new 和 operator delete 嗎?為什么 new [] 出來的數(shù)組有時可以用 delete 釋放有時又不行?…

如果你對這些問題都有疑問的話,不妨看看我這篇文章。

new 和 delete 到底是什么?

如果找工作的同學看一些面試的書,我相信都會遇到這樣的題:sizeof 不是函數(shù),然后舉出一堆的理由來證明 sizeof 不是函數(shù)。在這里,和 sizeof 類似,new 和 delete 也不是函數(shù),它們都是 C++ 定義的關鍵字,通過特定的語法可以組成表達式。和 sizeof 不同的是,sizeof 在編譯時候就可以確定其返回值,new 和 delete 背后的機制則比較復雜。繼續(xù)往下之前,請你想想你認為 new 應該要做些什么?也許你第一反應是,new 不就和 C 語言中的 malloc 函數(shù)一樣嘛,就用來動態(tài)申請空間的。你答對了一半,看看下面語句:

string *ps = new string("hello world");

你就可以看出 new 和 malloc 還是有點不同的,malloc 申請完空間之后不會對內(nèi)存進行必要的初始化,而 new 可以。所以 new exPRession 背后要做的事情不是你想象的那么簡單。在我用實例來解釋 new 背后的機制之前,你需要知道 operator new 和 operator delete 是什么玩意。

operator new 和 operator delete

這兩個其實是 C++ 語言標準庫的庫函數(shù),原型分別如下:

void *operator new(size_t);     //allocate an objectvoid *operator delete(void *);    //free an objectvoid *operator new[](size_t);     //allocate an arrayvoid *operator delete[](void *);    //free an array

后面兩個你可以先不看,后面再介紹。前面兩個均是 C++ 標準庫函數(shù),你可能會覺得這是函數(shù)嗎?請不要懷疑,這就是函數(shù)!C++ Primer 一書上說這不是重載 new 和 delete 表達式(如 operator= 就是重載 = 操作符),因為 new 和 delete 是不允許重載的。但我還沒搞清楚為什么要用 operator new 和 operator delete 來命名,比較費解。我們只要知道它們的意思就可以了,這兩個函數(shù)和 C 語言中的 malloc 和 free 函數(shù)有點像了,都是用來申請和釋放內(nèi)存的,并且 operator new 申請內(nèi)存之后不對內(nèi)存進行初始化,直接返回申請內(nèi)存的指針。

我們可以直接在我們的程序中使用這幾個函數(shù)。

new 和 delete 背后機制

知道上面兩個函數(shù)之后,我們用一個實例來解釋 new 和 delete 背后的機制:

我們不用簡單的 C++ 內(nèi)置類型來舉例,使用復雜一點的類類型,定義一個類 A:

class A{public:    A(int v) : var(v)    {        fopen_s(&file, "test", "r");    }    ~A()    {        fclose(file);    }private:    int var;    FILE *file;};

很簡單,類 A 中有兩個私有成員,有一個構造函數(shù)和一個析構函數(shù),構造函數(shù)中初始化私有變量 var 以及打開一個文件,析構函數(shù)關閉打開的文件。

我們使用

class A *pA = new A(10);

來創(chuàng)建一個類的對象,返回其指針 pA。如下圖所示 new 背后完成的工作:

簡單總結一下:

首先需要調(diào)用上面提到的 operator new 標準庫函數(shù),傳入的參數(shù)為 class A 的大小,這里為 8 個字節(jié),至于為什么是 8 個字節(jié),你可以看看《深入 C++ 對象模型》一書,這里不做多解釋。這樣函數(shù)返回的是分配內(nèi)存的起始地址,這里假設是 0x007da290。上面分配的內(nèi)存是未初始化的,也是未類型化的,第二步就在這一塊原始的內(nèi)存上對類對象進行初始化,調(diào)用的是相應的構造函數(shù),這里是調(diào)用 A:A(10); 這個函數(shù),從圖中也可以看到對這塊申請的內(nèi)存進行了初始化,var=10, file 指向打開的文件。最后一步就是返回新分配并構造好的對象的指針,這里 pA 就指向 0x007da290 這塊內(nèi)存,pA 的類型為類 A 對象的指針。

所有這三步,你都可以通過反匯編找到相應的匯編代碼,在這里我就不列出了。

好了,那么 delete 都干了什么呢?還是接著上面的例子,如果這時想釋放掉申請的類的對象怎么辦?當然我們可以使用下面的語句來完成:

delete pA;

delete 所做的事情如下圖所示:

delete 就做了兩件事情:

調(diào)用 pA 指向?qū)ο蟮奈鰳嫼瘮?shù),對打開的文件進行關閉。通過上面提到的標準庫函數(shù) operator delete 來釋放該對象的內(nèi)存,傳入函數(shù)的參數(shù)為 pA 的值,也就是 0x007d290。

好了,解釋完了 new 和 delete 背后所做的事情了,是不是覺得也很簡單?不就多了一個構造函數(shù)和析構函數(shù)的調(diào)用嘛。

如何申請和釋放一個數(shù)組?

我們經(jīng)常要用到動態(tài)分配一個數(shù)組,也許是這樣的:

string *psa = new string[10];      //array of 10 empty stringsint *pia = new int[10];           //array of 10 uninitialized ints

上面在申請一個數(shù)組時都用到了 new [] 這個表達式來完成,按照我們上面講到的 new 和 delete 知識,第一個數(shù)組是 string 類型,分配了保存對象的內(nèi)存空間之后,將調(diào)用 string 類型的默認構造函數(shù)依次初始化數(shù)組中每個元素;第二個是申請具有內(nèi)置類型的數(shù)組,分配了存儲 10 個 int 對象的內(nèi)存空間,但并沒有初始化。

如果我們想釋放空間了,可以用下面兩條語句:

delete [] psa;delete [] pia;

都用到 delete [] 表達式,注意這地方的 [] 一般情況下不能漏掉!我們也可以想象這兩個語句分別干了什么:第一個對 10 個 string 對象分別調(diào)用析構函數(shù),然后再釋放掉為對象分配的所有內(nèi)存空間;第二個因為是內(nèi)置類型不存在析構函數(shù),直接釋放為 10 個 int 型分配的所有內(nèi)存空間。

這里對于第一種情況就有一個問題了:我們?nèi)绾沃?psa 指向?qū)ο蟮臄?shù)組的大小?怎么知道調(diào)用幾次析構函數(shù)?

這個問題直接導致我們需要在 new [] 一個對象數(shù)組時,需要保存數(shù)組的維度,C++ 的做法是在分配數(shù)組空間時多分配了 4 個字節(jié)的大小,專門保存數(shù)組的大小,在 delete [] 時就可以取出這個保存的數(shù),就知道了需要調(diào)用析構函數(shù)多少次了。

還是用圖來說明比較清楚,我們定義了一個類 A,但不具體描述類的內(nèi)容,這個類中有顯示的構造函數(shù)、析構函數(shù)等。那么 當我們調(diào)用

class A *pAa = new A[3];

時需要做的事情如下:

從這個圖中我們可以看到申請時在數(shù)組對象的上面還多分配了 4 個字節(jié)用來保存數(shù)組的大小,但是最終返回的是對象數(shù)組的指針,而不是所有分配空間的起始地址。

這樣的話,釋放就很簡單了:

delete []pAa;

這里要注意的兩點是:

調(diào)用析構函數(shù)的次數(shù)是從數(shù)組對象指針前面的 4 個字節(jié)中取出;傳入 operator delete[] 函數(shù)的參數(shù)不是數(shù)組對象的指針 pAa,而是 pAa 的值減 4。

為什么 new/delete 、new []/delete[] 要配對使用?

其實說了這么多,還沒到我寫這篇文章的最原始意圖。從上面解釋的你應該懂了 new/delete、new[]/delete[] 的工作原理了,因為它們之間有差別,所以需要配對使用。但偏偏問題不是這么簡單,這也是我遇到的問題,如下這段代碼:

int *pia = new int[10];delete []pia;

這肯定是沒問題的,但如果把 delete []pia; 換成 delete pia; 的話,會出問題嗎?

這就涉及到上面一節(jié)沒提到的問題了。上面我提到了在 new [] 時多分配 4 個字節(jié)的緣由,因為析構時需要知道數(shù)組的大小,但如果不調(diào)用析構函數(shù)呢(如內(nèi)置類型,這里的 int 數(shù)組)?我們在 new [] 時就沒必要多分配那 4 個字節(jié), delete [] 時直接到第二步釋放為 int 數(shù)組分配的空間。如果這里使用 delete pia;那么將會調(diào)用 operator delete 函數(shù),傳入的參數(shù)是分配給數(shù)組的起始地址,所做的事情就是釋放掉這塊內(nèi)存空間。不存在問題的。

這里說的使用 new [] 用 delete 來釋放對象的提前是:對象的類型是內(nèi)置類型或者是無自定義的析構函數(shù)的類類型!

我們看看如果是帶有自定義析構函數(shù)的類類型,用 new [] 來創(chuàng)建類對象數(shù)組,而用 delete 來釋放會發(fā)生什么?用上面的例子來說明:

class A *pAa = new class A[3];delete pAa;

那么 delete pAa; 做了兩件事:

調(diào)用一次 pAa 指向的對象的析構函數(shù);調(diào)用 operator delete(pAa); 釋放內(nèi)存。

顯然,這里只對數(shù)組的第一個類對象調(diào)用了析構函數(shù),后面的兩個對象均沒調(diào)用析構函數(shù),如果類對象中申請了大量的內(nèi)存需要在析構函數(shù)中釋放,而你卻在銷毀數(shù)組對象時少調(diào)用了析構函數(shù),這會造成內(nèi)存泄漏。

上面的問題你如果說沒關系的話,那么第二點就是致命的了!直接釋放 pAa 指向的內(nèi)存空間,這個總是會造成嚴重的段錯誤,程序必然會奔潰!因為分配的空間的起始地址是 pAa 指向的地方減去 4 個字節(jié)的地方。你應該傳入?yún)?shù)設為那個地址!

同理,你可以分析如果使用 new 來分配,用 delete [] 來釋放會出現(xiàn)什么問題?是不是總會導致程序錯誤?

總的來說,記住一點即可:new/delete、new[]/delete[] 要配套使用總是沒錯的!

參考資料:

C++ Primer 第四版


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

日韩精品免费视频一区二区三区| 91麻豆精品国产91久久久使用方法| 国产99在线|亚洲| 精品视频1区2区3区| 亚洲国产无线乱码在线观看 | 午夜伦欧美伦电影理论片| 日韩国产在线观看一区| 国产视频二区| 亚洲 欧美 中文字幕| 日韩在线视频观看正片免费网站| 日韩欧美一级在线播放| 青青久在线视频免费观看| 欧美日韩免费视频| 91精品国产手机| 91精品国产综合久久福利| 免费视频国产一区| 九一精品国产| 亚洲第一精品在线| 欧美中文字幕视频| 人成免费在线视频| 婷婷中文字幕一区| 日韩不卡一区二区| 亚洲一区视频在线观看视频| www.中文字幕在线| 国产天堂素人系列在线视频| 中文字幕 日韩 欧美| 亚洲а∨精品天堂在线| 久久在线91| 欧美日韩国产成人| 国产日产一区二区三区| 久久在线91| a级在线免费观看| 欧美日韩在线观看首页| 欧美日韩国产一区| 在线国产91| 亚洲福利一区二区三区| 91精品国产丝袜白色高跟鞋| 久草视频观看| 亚洲综合日韩中文字幕v在线| 中文字幕亚洲高清| 日韩午夜中文字幕| 国产日韩综合| 国产最新在线| 久久久91精品国产| 亚洲一区在线观看网站| 免费看日韩精品| 欧美中日韩在线| 日韩欧美色综合网站| 日韩欧美视频一区二区三区四区| 国产高清大尺度一区二区不卡| 天堂在线中文资源| 日本免费在线视频不卡一不卡二| 精品久久久三级| 91精品婷婷国产综合久久竹菊| 国产欧美日韩在线视频| 一区三区二区视频| 精品成人久久av| 中文字幕在线视频久| 欧美一级二级三级区| 日韩视频在线免费播放| 亚洲va韩国va欧美va精品| 欧美一卡2卡三卡4卡5免费| 精品国产99| 一区在线视频观看| 日本精品国语自产拍在线观看| 精品久久在线| 91www成人久久| 国产福利一区在线观看| 色综合天天性综合| 日韩欧美国产黄色| 91精品久久久久久久久久入口| 91精品久久久久久久91蜜桃| 中文字幕在线欧美| 欧美精品一区二区三区在线播放| 色屁屁一区二区| 国产日韩亚洲欧美| 一本大道一区二区三区| 国产乱国产乱老熟300| 欧美日韩精品中文字幕| 日韩中文字幕视频在线观看| 亚洲欧美小说国产图片| 中文字幕欧美人妻精品一区蜜臀| www.久久久精品| 天堂精品高清1区2区3区| 亚洲一区中文| www.久久草| 先锋男人资源站| 久久 天天综合| 精品中文字幕在线播放| 日韩久久在线| 在线视频亚洲| 亚洲欧美99| 国产福利在线播放| 国产一级片播放| 中文字幕高清在线播放| 欧美高清视频一区二区三区| 欧美午夜精品在线| 92久久精品| 影音先锋中文字幕在线观看| 日韩在线中文字幕| 中文字幕国产欧美| 日韩手机在线观看视频| 欧美日韩中文字幕在线观看| 黄色片免费看| 蜜臀国产一区| 午夜一区二区视频| 国产午夜精品一区二区三区视频| 国产中文在线| 欧美三级在线播放| 精品成a人在线观看| 久久99蜜桃精品| 深夜福利一区二区| 国产一区在线精品| 一区二区中文字幕在线| 国产一级片播放| 亚洲黄色片在线观看| 日韩中文字幕国产| 午夜一区二区三区视频| 日韩在线视频一区二区三区| 中文字幕在线观看网址| 国产日韩中文在线| 国产123在线| 日韩精品手机在线| 中文字幕日韩国产| 樱花草www在线| 午夜国产在线视频| 国产成人精品综合网站| 中文天堂在线一区| 日韩在线视频二区| 影音先锋一区二区资源站| 国内精品露脸在线视频播放| 最近中文字幕第一页| av一区在线观看| 久本草在线中文字幕亚洲欧美| www中文字幕在线观看| 人成在线免费视频| 午夜国产欧美理论在线播放| 亚洲免费婷婷| 欧美日韩三级在线| 欧美一级二级三级区| 日韩视频一区| 不卡视频一区二区三区| 日韩精品 欧美| 一级免费a一片| 日韩一级二级三级| 中文在线第一页| 日韩中文字幕91| 91精品啪在线观看国产60岁| 黄色片免费在线| 亚洲第一视频网站| 日韩欧美亚洲日产国| 亚洲成av人片一区二区密柚| 国产亚洲人成a一在线v站| 日本不卡免费高清视频| 久久激情一区| 免费在线国产| 欧美三级在线播放| 色综合天天性综合| 99pao成人国产永久免费视频| 在线国产99| 国产欧美日韩不卡| 欧美综合精品| 快she精品国产999| 欧美日韩亚洲国内综合网俺| 日韩国产高清一区| 欧美一级一级性生活免费录像| 999精品网| 国产www在线观看| 国产一级视频在线播放| 亚洲免费精品| 亚洲免费播放| 日韩欧美综合| 不卡av免费在线| 欧美日韩国产大片| 国产裸体歌舞团一区二区| 一级片在线播放| eeuss一区| 在线观看中文字幕一区| 精品国产免费观看一区| 亚洲高清在线免费| 激情五月综合| 日韩精品在线网站| 中文字幕欧美亚洲| 黄色一区二区在线观看| 欧美日韩中文字幕| 欧美成人精品在线| 中文字幕在线观看精品| 人妻一区二区三区免费| 成人xxxx| 日韩欧美在线1卡| 欧美日韩成人综合| 日韩欧美综合视频| 久久激情中文| 欧美日韩精品在线观看| 精品视频资源站| 精品一区二区在线观看视频| 国产91久久久久蜜臀青青天草二 | 中文字幕第一页在线播放| 欧美日韩国产成人| 亚洲高清在线免费| 国产网站欧美日韩免费精品在线观看 | 精品久久人人做人人爽| 久久久精品国产免费观看同学| 国产成人精品网址| 午夜国产在线视频| 精品久久人人做人人爽| 一区二区不卡视频在线观看| 国产日韩精品久久久| 免费高清特黄a大片| 久久中文精品| 国产乱码在线观看| 精品国产31久久久久久| 中文字幕第一页在线播放| 日韩三级免费观看| 国产黄在线观看| 亚洲一区在线观看视频| 1区2区在线| 国产欧美日韩最新| 国产日韩精品久久久| 国产成人精品综合网站| 欧美久久久精品| 一区二区在线观看不卡| 欧美日韩精品不卡| 高清日韩中文字幕| 中文字幕视频在线观看| 久久久91精品| 欧美 日韩 国产 高清| 中文字幕在线高清| 国产日韩精品在线观看| 日韩欧美国产黄色| 色综合天天综合网国产成人综合天| 国产黄在线看| 中文字幕欧美日韩在线不卡| 二区三区中文字幕| 成人ww免费完整版在线观看| 欧美日韩中文字幕在线观看| 免费国产成人看片在线| 在线视频不卡国产V| 精品久久久精品| 日韩精品在线免费观看| 精品国产1区2区3区| 日韩在线视频一区二区三区| 免费在线视频一级不卡| 被陌生人带去卫生间啪到腿软| 久久婷婷综合国产| 粉嫩喷白浆久久| 91精品国产91久久久久久青草| 搞黄在线观看| 99中文字幕一区| 亚洲成年人影院在线| 精品久久久精品| 国产欧美综合视频| 国产啊啊啊视频在线观看| 欧美日韩国产高清| 一区二区视频在线| 中文字幕在线国产| 麻豆精品视频入口| 精品国产乱码久久久久久蜜臀| 一区二区在线视频播放| 日韩中文在线字幕| 在线资源av| 中文字幕欧美国内| 国产第一页在线播放| 欧美日韩在线不卡| 亚洲欧洲精品在线| 中文字幕国产在线| 欧美日韩国产综合视频在线观看中文| 91久久久久久久久| 日韩欧美在线精品| 日韩视频在线免费看| 欧美99久久| 国产蜜臀在线| 日韩中文字幕第一页| 色www精品视频在线观看| 国产 中文 字幕 日韩 在线| 精品国产欧美日韩| 在线观看国产一级片| 日韩欧美国产综合| 久久精品最新免费国产成人| 色欧美日韩亚洲| 精品国产网站在线观看| 人妻一区二区三区免费| 国产欧美日韩综合| 精品久久91| 精品日韩av| 国产一级片在线| 日韩三级一区二区| 白嫩少妇丰满一区二区| 国产免费久久| 国产黄色片中文字幕| 精品国产乱码一区二区| 日韩在线视频免费观看| 欧美三级三级三级爽爽爽| 国产调教精品| 在线看的av| 国产欧美日韩精品在线观看| 亚洲欧洲日韩在线| 欧美日韩在线视频一区| 欧美日韩午夜在线视频| 亚洲黄页一区| 日韩欧美中文第一页| 日本啊v在线| 国产最新在线| 精品欧美不卡一区二区在线观看| 色屁屁一区二区| 久久久久蜜桃| 欧美日韩午夜在线视频| 精品1区2区3区| 欧美日韩国产不卡| 欧美 日韩 国产 高清| 刘玥91精选国产在线观看| 久草视频在线看| 亚洲一级特黄| 国产免费久久| 日韩欧美一级精品久久| 精品在线一区二区| 欧洲精品在线一区| 中文字幕第一页在线播放| 亚洲乱码在线观看| 日韩三级精品电影久久久| 欧美日韩亚洲91| 国产视频一二区| 亚洲欧洲日产国码av系列天堂| 欧美日韩国产大片| 国产中文在线视频| 久久久99久久| 在线欧美一级视频| 国产嫩草影院久久久久| 日韩中文字幕国产| 欧美日韩一二三四| 欧美日韩精品免费看| 欧美亚洲专区| 国产99在线 | 亚洲| 日韩三级一区| 精品熟女一区二区三区| 久久精品国产91精品亚洲| 欧美日中文字幕| 亚洲中文字幕在线一区| 国产偷国产偷亚洲清高网站| 日韩免费不卡avV| 亚洲欧美日本国产专区一区| 中文字幕在线导航| 91精品国产色综合久久不卡蜜臀| 精品999视频| 在线观看国产一级片| www日韩在线观看| 欧美日韩精品高清| 亚洲欧美日本另类| 日韩欧美色综合| 亚洲午夜av| 久久香蕉精品| 亚洲经典中文字幕| 欧美 日韩 综合| 欧美一级免费观看| 成人禁用看黄a在线| 精品国产乱码久久久久久牛牛| 97国产视频| 国产日产一区二区三区| 国产在成人精品线拍偷自揄拍| 欧美日韩中文字幕综合视频| 欧美日韩亚洲一区| 久久精品免费看| 免费一级欧美在线观看视频| 日韩欧美中文字幕一区| 欧美日韩亚洲综合在线| 国产欧美综合视频| 国产乱国产乱老熟300部视频| 久久久久久91| 中文字幕国产欧美| 欧美日韩在线不卡| 欧美日韩国产在线观看| 黄色一区二区视频| 视频一区视频二区中文| 国产区视频在线观看| 久久激情中文| 亚洲成年人在线播放| 一本一道综合狠狠老| 亚洲一区精品电影| 国产在线小视频| 午夜亚洲一区| 欧美日韩成人综合| 国产绿帽一区二区三区| 77777_亚洲午夜久久多人| 亚洲热线99精品视频| 亚洲欧洲三级| 国产婷婷精品| 精品欧美日韩| 在线免费视频一区二区| 在线精品日韩| 亚洲国产91精品在线观看| 国产在线拍偷自揄拍精品| 黄色片网站在线| 中文字幕视频在线免费欧美日韩综合在线看| 91久久精品国产91久久| 久久精品不卡| 一区二区精品免费| www日韩在线观看| 日韩三级精品| 免费国产h视频在线观看86| 国产高清不卡av|