亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中的數(shù)據(jù)內(nèi)存分布原理

 更新時間:2023年05月18日 11:29:23   作者:ly@?_?  
這篇文章主要介紹了C++中的數(shù)據(jù)內(nèi)存分布,主要從動態(tài)內(nèi)存管理方式,內(nèi)存泄漏等方面介紹的,文中也有相關(guān)的示例代碼,需要的朋友可以參考下

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

先看下面的代碼:

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);
 	free(ptr3);
}

1. 棧又叫堆棧–非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等等,棧是向下增長的。
3. 堆用于程序運行時動態(tài)內(nèi)存分配,堆是可以上增長的。
4. 數(shù)據(jù)段–存儲全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)。
5. 代碼段–可執(zhí)行的代碼/只讀常量。

選擇題:
選項: A.棧 B.堆 C.數(shù)據(jù)段(靜態(tài)區(qū)) D.代碼段(常量區(qū))
globalVar在哪里? staticGlobalVar在哪里?staticVar在哪里? localVar在哪里?num1 在哪里?char2在哪里? *char2在哪里?pChar3在哪里? *pChar3在哪里? ptr1在哪里?*ptr1在哪里?
答:首先,全局變量存放在靜態(tài)區(qū),靜態(tài)變量存放在靜態(tài)區(qū)里,局部變量存放在棧區(qū)里,自己開辟的內(nèi)存(malloc,calloc,realloc,new)放在堆區(qū)里。
pChar3,ptr1,ptr2,ptr3這些數(shù)據(jù)放在棧區(qū),而*pChar指向的內(nèi)存放在常量區(qū),*ptr1,*ptr2,*ptr3指向的內(nèi)存放在棧區(qū)。
globalVar在哪里?C ; staticGlobalVar在哪里?C;
staticVar在哪里?C ;localVar在哪里?A ; num1 在哪里?A;
char2在哪里?A ; *char2在哪里?A;
pChar3在哪里?A ; *pChar3在哪里?D;
ptr1在哪里?A ; *ptr1在哪里?B;

2. C語言中動態(tài)內(nèi)存管理方式

C語言中動態(tài)內(nèi)存管理方式:malloc/calloc/realloc/free

3. C++中動態(tài)內(nèi)存管理

C語言內(nèi)存管理方式在C++中可以繼續(xù)使用,但有些地方就無能為力,而且使用起來比較麻煩,因此C++又提出了自己的內(nèi)存管理方式:通過new和delete操作符進行動態(tài)內(nèi)存管理。
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續(xù)的空間,使用
new[]和delete[],注意:匹配起來使用。

int main()
{
	// 動態(tài)申請一個int類型的空間并初始化為 5
	int* ptr1 = new int(5);
	// 動態(tài)申請10個int類型的空間
	int* ptr2 = new int[10];

	for (int i = 0; i < 10; ++i)
	{
		ptr2[i] = i;
	}
	cout << "ptr1 = " << * ptr1 << endl;
	cout << "ptr2 = ";
	for (int i = 0; i < 10; ++i)
	{
		cout << ptr2[i] << ' ';
	}
	cout << endl;
	delete ptr1;
	delete[] ptr2;

	return 0;
}

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

系統(tǒng)提供的全局函數(shù),new在底層調(diào)用operator new全局函數(shù)來申請空間,delete在底層通過operator delete全局函數(shù)來釋放空間。

/*
operator new:該函數(shù)實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間
失敗,嘗試執(zhí)行空               間不足應(yīng)對措施,如果改應(yīng)對措施用戶設(shè)置了,則繼續(xù)申請,否
則拋異常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
     if (_callnewh(size) == 0)
     {
         // report no memory
         // 如果申請內(nèi)存失敗了,這里會拋出bad_alloc 類型異常
         static const std::bad_alloc nomem;
         _RAISE(nomem);
     }
return (p);
}
/*
operator delete: 該函數(shù)最終是通過free來釋放空間的
*/
void operator delete(void *pUserData)
{
     _CrtMemBlockHeader * pHead;
     RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
     if (pUserData == NULL)
         return;
     _mlock(_HEAP_LOCK);  /* block other threads */
     __TRY
         /* get a pointer to memory block header */
         pHead = pHdr(pUserData);
          /* verify block type */
         _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
         _free_dbg( pUserData, pHead->nBlockUse );
     __FINALLY
         _munlock(_HEAP_LOCK);  /* release other threads */
     __END_TRY_FINALLY
     return;
}
/*
free的實現(xiàn)
*/
#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

通過上述兩個全局函數(shù)的實現(xiàn)知道,operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執(zhí)行用戶提供的空間不足應(yīng)對措施,如果用戶提供該措施就繼續(xù)申請,否則就拋異常。operator delete 最終是通過free來釋放空間的。

5. new和delete的實現(xiàn)原理

5.1 內(nèi)置類型

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

5.2 自定義類型

new的原理

  • 調(diào)用operator new函數(shù)申請空間
  • 在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造

delete的原理

  • 在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作
  • 調(diào)用operator delete函數(shù)釋放對象的空間

new T[N]的原理

  • 調(diào)用operator new[]函數(shù),在operator new[]中實際調(diào)用operator new函數(shù)完成N個對象空間的申請
  • 在申請的空間上執(zhí)行N次構(gòu)造函數(shù)

delete[]的原理

  • 在釋放的對象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個對象中資源的清理
  • 調(diào)用operator delete[]釋放空間,實際在operator delete[]中調(diào)用operator delete來釋放空間

6. malloc/free和new/delete的區(qū)別

malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放。不同的地
方是:
1.malloc和free是函數(shù),new和delete是操作符
2.malloc申請的空間不會初始化,new可以初始化
3.malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的類型即可,如果是多個對象,[]中指定對象個數(shù)即可
4.malloc的返回值為void*, 在使用時必須強轉(zhuǎn),new不需要,因為new后跟的是空間的類型
5.malloc申請空間失敗時,返回的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲異常
6.申請自定義類型對象時,malloc/free只會開辟空間,不會調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請空間后會調(diào)用構(gòu)造函數(shù)完成對象的初始化,delete在釋放空間前會調(diào)用析構(gòu)函數(shù)完成空間中資源的

7.內(nèi)存泄漏

什么是內(nèi)存泄漏,內(nèi)存泄漏的危害

內(nèi)存泄漏:內(nèi)存泄漏指因為疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并不是指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,因為設(shè)計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費。
內(nèi)存泄漏的危害:長期運行的程序出現(xiàn)內(nèi)存泄漏,影響很大,如操作系統(tǒng)、后臺服務(wù)等等,出現(xiàn)內(nèi)存泄漏會導(dǎo)致響應(yīng)越來越慢,最終卡死。

內(nèi)存泄漏分類(了解)

C/C++程序中一般我們關(guān)心兩種方面的內(nèi)存泄漏:
堆內(nèi)存泄漏(Heap leak)
堆內(nèi)存指的是程序執(zhí)行中依據(jù)須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊內(nèi)存,用完后必須通過調(diào)用相應(yīng)的 free或者delete 刪掉。假設(shè)程序的設(shè)計錯誤導(dǎo)致這部分內(nèi)存沒有被釋放,那么以后這部分空間將無法再被使用,就會產(chǎn)生Heap Leak。
系統(tǒng)資源泄漏
指程序使用系統(tǒng)分配的資源,比方套接字、文件描述符、管道等沒有使用對應(yīng)的函數(shù)釋放掉,導(dǎo)致系統(tǒng)資源的浪費,嚴重可導(dǎo)致系統(tǒng)效能減少,系統(tǒng)執(zhí)行不穩(wěn)定。

如何避免內(nèi)存泄漏

  • 工程前期良好的設(shè)計規(guī)范,養(yǎng)成良好的編碼規(guī)范,申請的內(nèi)存空間記著匹配的去釋放。ps:這個理想狀態(tài)。但是如果碰上異常時,就算注意釋放了,還是可能會出問題。需要下一條智能指針來管理才有保證。
  • 采用RAII思想或者智能指針來管理資源。
  • 出問題了使用內(nèi)存泄漏工具檢測。ps:不過很多工具都不夠靠譜,或者收費昂貴。

總結(jié)一下:
內(nèi)存泄漏非常常見,解決方案分為兩種:1、事前預(yù)防型。如智能指針等。2、事后查錯型。如泄漏檢測工具。

以上就是C++中的數(shù)據(jù)內(nèi)存分布原理的詳細內(nèi)容,更多關(guān)于C++ 數(shù)據(jù)內(nèi)存分布的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談c語言中一種典型的排列組合算法

    淺談c語言中一種典型的排列組合算法

    下面小編就為大家?guī)硪黄獪\談c語言中一種典型的排列組合算法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 擴展KMP算法(Extend KMP)

    擴展KMP算法(Extend KMP)

    我們這里說的KMP不是拿來放電影的(雖然我很喜歡這個軟件),而是一種算法。KMP算法是拿來處理字符串匹配的。今天我們談到的是對KMP算法的拓展
    2014-08-08
  • C語言實現(xiàn)Floyd算法

    C語言實現(xiàn)Floyd算法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)Floyd算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C/C++中的OpenCV讀取視頻與調(diào)用攝像頭

    C/C++中的OpenCV讀取視頻與調(diào)用攝像頭

    這篇文章主要介紹了C/C++中的OpenCV讀取視頻與調(diào)用攝像頭,具有很好的參考價值,希望對大家有所幫助。
    2022-11-11
  • 關(guān)于C語言位運算的簡單示例

    關(guān)于C語言位運算的簡單示例

    這篇文章主要介紹了關(guān)于C語言位運算的簡單示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解

    從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解

    這篇文章主要為大家介紹了從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • C++ socket實現(xiàn)miniFTP

    C++ socket實現(xiàn)miniFTP

    這篇文章主要為大家詳細介紹了C++ socket實現(xiàn)miniFTP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • C++小知識:盡可能使用枚舉類

    C++小知識:盡可能使用枚舉類

    今天小編就為大家分享一篇關(guān)于C++小知識:盡可能使用枚舉類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言跟內(nèi)存申請相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語言中動態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • C語言中宏和函數(shù)的9個區(qū)別詳解

    C語言中宏和函數(shù)的9個區(qū)別詳解

    C語言中的宏和函數(shù)是非常相似的,它們都可以完成類似的功能。本文為大家整理了C語言中宏和函數(shù)的9個區(qū)別,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04

最新評論