目錄
一、簡要描述兩者的作用
二、實例解析
1. 淺層區別
2. 深層區別
三、拓展(operator new 的妙用)
一、簡要描述兩者的作用
new : 是c++推崇的 內存申請 方式,擁有比 malloc 更先進的機制
delete :是 對應的 內存釋放方式,擁有比 free 更先進的機制
二、實例解析
1. 淺層區別
malloc 需要 計算實際需要的 字節數,而 new 則不需要
new 在申請基礎類型內存塊時,可以對 空間進行初始化 ,malloc 則不會
new 在內存申請失敗后 會拋出異常,?而 malloc 則是返回NULL 需要對指針進行 NULL 檢查
int main()
{int* arr = (int*)malloc(sizeof(int)*2);if (arr == NULL){cout << "檢查后 -- malloc 失敗" << endl;return 1;}elsecout << arr[0] << " " << arr[1] << endl;int* arr2 = new int[2] {1, 2};cout << arr2[0] << " " << arr2[1] << endl;return 0;
}
2. 深層區別
在對自定義類型(類,結構體等)進行內存申請時,malloc 同樣只是申請對應 字節大小的空間,而 new 則會在申請后,去調用 自定義類型的 構造方法,對其進行初始化
同樣 delete 在 釋放 空間時 會去調用對應的 析構方法,實現對 類對象的 完全釋放,避免成員指針指向空間沒有被釋放的 泄露問題。
class Test_new_delete
{
public:Test_new_delete(){_arrptr = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "new 主動調用構造方法 " << endl;}~Test_new_delete(){cout << "delete 主動調用析構方法 并對成員指針進行了釋放防止內存泄漏 " << endl;delete[] _arrptr;}int* _arrptr;
};
int main()
{Test_new_delete* ptr0 = (Test_new_delete*)malloc(sizeof(ptr0));cout << "malloc 創建的ptr0 沒有進行初始化 :" << ptr0->_arrptr << endl;free(ptr0);cout << "free 只是釋放了的內存塊,但是其中的指針所指向的空間并沒有被釋放,會造成內存泄露 " << endl;cout << endl << " ----------- " << endl << endl;Test_new_delete* ptr = new Test_new_delete;cout << "malloc 創建的ptr 通過調用構造方法進行初始化 :" << ptr->_arrptr << endl;delete ptr;return 0;
}
三、拓展(operator new 的妙用)
1. 在 調用 new? 之后 ,new 內部會去調用 operator new? ,庫中operator new 再去調用 malloc 進而進行內存申請,但是 operator new 中還會 在申請內存后進行 檢查,如果malloc 內存申請失敗 則會進行拋異常。
2. 用戶可以在類中 對 operator new 進行重載,進而實現 指定類在調用 new 之后 ,去調用 自己實現 的 operator new ,而不調用 庫函數,進一步實現 功能的自定義
class ST
{
public :void* operator new(size_t i){cout << "調用自己實現的 operator new" << endl;return (void*) 9;}
};
int main()
{void* ptr = new ST();cout << ptr << endl;return 0;
}