首頁 > 軟體

C++全面覆蓋記憶體管理知識講解

2022-06-18 14:02:10

前言

C語言記憶體管理方式在C++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此C++又提出了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理。

一、C++記憶體管理方式

1.1new/delete操作內建型別

void Test()
{
// 動態申請一個int型別的空間
int* ptr4 = new int;
// 動態申請一個int型別的空間並初始化為10
int* ptr5 = new int(10);
// 動態申請10個int型別的空間
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new[]和delete[]

二、operator new與operator delete函數

2.1operator new與operator delete函數

new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new 和operator delete是系統提供的全域性函數,new在底層呼叫operator new全域性函數來申請空間,delete在底層通過operator delete全域性函數來釋放空間。

/*
operator new:該函數實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,
嘗試執行空 間不足應對措施,如果改應對措施使用者設定了,則繼續申請,否則拋異常。
*/
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
// 如果申請記憶體失敗了,這裡會丟擲bad_alloc 型別異常
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
/*
operator delete: 該函數最終是通過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的實現
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

通過上述兩個全域性函數的實現知道,operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。operator delete 最終是通過free來釋放空間的。

二、new和delete的實現原理

2.1內建型別

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

2.2 自定義型別

new的原理

  • 呼叫operator new函數申請空間
  • 在申請的空間上執行建構函式,完成物件的構造

delete的原理

  • 在空間上執行解構函式,完成物件中資源的清理工作
  • 呼叫operator delete函數釋放物件的空間

new T[N]的原理

  • 呼叫operator new[]函數,在operator new[]中實際呼叫operator new函數完成N個物件空間的申請
  • 在申請的空間上執行N次建構函式

delete[]的原理

  • 在釋放的物件空間上執行N次解構函式,完成N個物件中資源的清理
  • 呼叫operator delete[]釋放空間,實際在operator delete[]中呼叫operator delete來釋放空間

到此這篇關於C++全面覆蓋記憶體管理知識講解的文章就介紹到這了,更多相關C++記憶體管理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com