C++動態內存管理及其與C語言動態內存管理的差別

在C語言中,我們常用malloc、calloc、realloc和free等函數來進行動態內存管理。

但是在C++中,我們則需要用到某些操作符進行動態內存管理。

new / delete —— 動態管理對象

new[] / delete[] —— 動態管理數組

▲new / delete 和 new[] / delete[] 一定要匹配使用!否則會內存泄漏!

void Test1()
{
	int* p1 = new int;		//創建一個int*類型指針,給指向的空間分配1個int大小的空間
	int* p2 = new int(10086);	//創建一個int*類型指針,給指向的空間分配1個int大小的空間,並對其指向的空間進行初始化
	int* p3 = new int[2];		//創建一個int*類型的指針,給指向的空間分配3個int大小的空間

	p3[0] = 1;
	p3[1] = 2;

	delete p1;			//刪除給p1所分配的空間
	delete p2;			//刪除給p2所分配的空間
	delete[] p3;			//刪除給p3所分配的空間
}

對C語言有動態內存管理的人可能會有疑惑:明明C語言中已經有 malloc / free 函數進行動態內存管理了,C++又兼容C語言,那爲什麼我們還要使用 new / delete 和 new[] / delete[] 呢?

這要從 new / delete 背後的機制談起了。


在使用new時,編譯器進行兩步操作:

1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)

2.調用被分配類型的構造函數

在使用delete時,編譯器進行兩步操作:

1.調用被分配類型的析構函數

2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)


在使用new[N]時,編譯器進行兩步操作:

1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)

2.調用N次被分配類型的構造函數

在使用delete[]時,編譯器進行兩步操作:

1.調用N次被分配類型的析構函數

2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)


整體來說,malloc() 在申請內存時候不會調用構造函數,free() 釋放內存之後也不會調用析構函數,而 new / delete 進行申請 / 釋放內存的時候則會調用,所以簡單的說,在對c++內置類型進行動態內存管理的時候,使用 malloc() / free() 和 new / delete 的差別不大,但是在對用戶自定義類型進行動態內存管理的時候,則必須使用 new / delete 或 new[] / delete[]。


在使用new時,編譯器進行兩步操作:

1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)

2.調用被分配類型的構造函數

在使用delete時,編譯器進行兩步操作:

1.調用被分配類型的析構函數

2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章