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

C++ new與malloc和delete及free動態(tài)內(nèi)存管理及區(qū)別介紹

 更新時間:2022年12月19日 12:56:37   作者:Huuaaaaa  
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動態(tài)內(nèi)存管理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一般情況-堆上申請普通變量空間

申請堆空間時,實驗表明 new/malloc 與 delete/free 是可以混用的,即可以通過free()釋放掉new出來的一塊內(nèi)存。

int main() {
	int *p = new int(123);
	delete p;
	//free(p);
}

特殊情況-堆上申請對象空間

class Person{
public:
	Person(){
		cout << "construct call ......" << endl;
	}
	~Person(){
		cout << "destruct call ......" << endl;
	}
private:
	int m_age;
};
int main() {
	Person *ptr = new Person();
	if (ptr != nullptr)
	{
		free(ptr);
	}
	return 0;
}

單步走看內(nèi)存分布圖:

可以看到,執(zhí)行完free(ptr) 后,內(nèi)存確實是被釋放了。(補充一下:fd作為開始結(jié)束的標(biāo)志,"cd cd cd cd"代表開辟的內(nèi)存,四個字節(jié))

但是!對于一個對象而言,new和delete關(guān)鍵字還額外做了 調(diào)用構(gòu)造函數(shù)和調(diào)用析構(gòu)函數(shù)這兩個步驟。

可以看到,程序只調(diào)用了構(gòu)造函數(shù)(new關(guān)鍵字產(chǎn)生),但是由于使用的是free(),因此并沒有調(diào)用類中的析構(gòu)函數(shù)。

一般情況-堆上申請普通數(shù)組空間

int main() {
	int *ptr = new int[10];
	delete[]ptr;
	//delete ptr;
	return 0;
}

我們知道,用new在堆上申請數(shù)組空間,一般delete的時候都需要加上[ ] ,即 delete[ ] 。

但實驗表明,如果不涉及到類對象,不加[ ]也同樣可以實現(xiàn)空間的釋放,加不加[ ]是沒有區(qū)別的。

特殊情況-堆上申請對象數(shù)組空間

int main() {
	Person *ptr = new Person[10];
	delete ptr;
	return 0;
}

當(dāng)new一個對象數(shù)組時,如果沒有用delete[ ] ,會發(fā)生崩潰報錯:

修改成delete [ ] ptr后,程序正常運行,并調(diào)用了十次構(gòu)造函數(shù)和十次析構(gòu)函數(shù):

進(jìn)一步探索:為什么修改為delete [ ] 就會調(diào)用十次析構(gòu)函數(shù)?它是如何知道創(chuàng)建了十個對象就一定會析構(gòu)十個對象?

查看一下此種情況下的內(nèi)存分布:

可以看到我們申請的堆對象數(shù)組空間(10個),仔細(xì)查看改起始地址的前一個地址,按道理這并不屬于我們分配的空間,為什么會多一個地址?

0x011E4EC8 ,該地址保存的值顯示為16進(jìn)制,轉(zhuǎn)換為十進(jìn)制剛好為10(0a 00 00 00)。這個10代表著什么?

不妨修改一下這個地址,0a 00 00 00 修改成 07 00 00 00 后接著單步走:

此時原來的十個地址空間的確是完整的被釋放了,但是析構(gòu)函數(shù)只被調(diào)用了 7次!正好是自己修改的那個內(nèi)存地址的值。

到這里可以得出結(jié)論: 編譯器是如何記錄new 創(chuàng)建出來數(shù)組對象的個數(shù), 就是簡單的在創(chuàng)建空間的前一個地址,記錄了創(chuàng)建對象的個數(shù),析構(gòu)的時候就按照這個地址的值進(jìn)行析構(gòu)。

總結(jié)

1. 申請一個堆上的對象時,不允許混搭new/delete 必須搭配使用。

2. new [ ] 和 delete [ ] 一定要配套使用,特別是申請對象數(shù)組時。

3. vs編譯器會在new [ ] 申請對象數(shù)組時,在堆開始的前4個字節(jié)寫入當(dāng)前數(shù)組的長度,用于記錄delete [ ]釋放時候的析構(gòu)函數(shù)調(diào)用。

到此這篇關(guān)于C++ new與malloc和delete及free動態(tài)內(nèi)存管理及區(qū)別介紹的文章就介紹到這了,更多相關(guān)C++動態(tài)內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中動態(tài)內(nèi)存管理初學(xué)者容易犯的6個錯誤分享

    C語言中動態(tài)內(nèi)存管理初學(xué)者容易犯的6個錯誤分享

    本篇文章主要介紹了初學(xué)者使用C語言中動態(tài)內(nèi)存管理的4個函數(shù)時最容易犯的6個錯誤,以及如何避免這些錯誤,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • VC對自定義資源加密解密(AES)的詳解

    VC對自定義資源加密解密(AES)的詳解

    本篇文章是對VC對自定義資源加密解密(AES)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C語言中結(jié)構(gòu)體變量私有化詳解

    C語言中結(jié)構(gòu)體變量私有化詳解

    結(jié)構(gòu)是由基本數(shù)據(jù)類型構(gòu)成的、并用一個標(biāo)識符來命名的各種變量的組合,下面這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體變量私有化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • C語言中extern詳細(xì)用法解析

    C語言中extern詳細(xì)用法解析

    這篇文章主要介紹了C語言中extern詳細(xì)用法解析,本文講解的extern也是C語言中的關(guān)鍵詞,用來修飾函數(shù)聲明或變量等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C語言中g(shù)etgid()函數(shù)和getegid()函數(shù)的區(qū)別

    詳解C語言中g(shù)etgid()函數(shù)和getegid()函數(shù)的區(qū)別

    這篇文章主要介紹了詳解C語言中g(shù)etgid()函數(shù)和getegid()函數(shù)的區(qū)別,注意getegid只返回有效的組識別碼,需要的朋友可以參考下
    2015-08-08
  • C/C++實現(xiàn)動態(tài)庫動態(tài)加載

    C/C++實現(xiàn)動態(tài)庫動態(tài)加載

    在很多項目中,我們多少會用到第三方動態(tài)庫,這些動態(tài)庫一般都是相對固定,使用也很簡單,下面我們就來看看c/c++中如何實現(xiàn)動態(tài)庫動態(tài)加載吧
    2024-01-01
  • C語言冒泡排序法心得

    C語言冒泡排序法心得

    相信學(xué)過C語言的朋友都知道,在C語言中,常用的排序算法有:冒泡排序、快速排序、插入排序、選擇排序、希爾排序、堆排序以及歸并排序等等。就算沒有用過,相信大家也有所耳聞。在這里呢,主要是想和大家一起來探討探討C語言的冒泡排序法,
    2016-01-01
  • C語言利用EasyX實現(xiàn)繪制足球圖案

    C語言利用EasyX實現(xiàn)繪制足球圖案

    這篇文章主要為大家詳細(xì)介紹了C語言如何利用EasyX繪圖庫實現(xiàn)繪制一個簡單的足球圖案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • C++?Boost?Foreach超詳細(xì)分析講解

    C++?Boost?Foreach超詳細(xì)分析講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C語言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用

    C語言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用

    結(jié)構(gòu)體和聯(lián)合體用于描述事物的屬性,如一只鳥的信息,可能包括它的品種,體重,顏色,年齡等,接下來大家一起來詳細(xì)看看吧
    2022-05-05

最新評論

新竹县| 肇东市| 乐平市| 洛隆县| 卢龙县| 金昌市| 平和县| 砀山县| 巴青县| 泌阳县| 伊吾县| 禹城市| 思茅市| 滨海县| 桦甸市| 龙州县| 云浮市| 泽库县| 兴隆县| 梓潼县| 凤庆县| 镇远县| 宾川县| 霍林郭勒市| 三门县| 南昌市| 东港市| 井陉县| 湾仔区| 万全县| 肥东县| 义乌市| 岗巴县| 永兴县| 原阳县| 平舆县| 珲春市| 思南县| 满城县| 兴和县| 灵川县|