文編寫參考狄泰軟體學院唐佐林老師的視訊課程,如有錯誤之處,歡迎指正。
new關鍵字的功能類似於c語言中的malloc,它們都是從堆空間中申請一段記憶體。下面 下麪幾點是兩者之間的異同點:
在c++中在堆空間爲物件申請空間時,是需要呼叫建構函式的,而這個必須通過new關鍵字來實現,因爲採用malloc函數只是說從堆空間中申請一段記憶體,但是並不會呼叫建構函式,也就是說生成的物件是不合法的.
因爲這樣雖然可以通過編譯,但是這是會帶來問題的,假設用new爲物件在對空間中申請了一段記憶體,那麼此時就會出發建構函式的呼叫,從而完成物件的構造,當使用delete關鍵字來歸還空間時,首先會呼叫解構函式,進行物件的銷燬,然後再歸還空間,但是當使用free函數來歸還空間,這時是不會自動呼叫解構函式的,它完成的工作僅僅是歸還堆空間,那麼如果此時物件裏面的成員變數也是從堆空間裏面申請的,那麼這時就會造成記憶體泄露。同樣地,我們不能夠用delete用mallocd申請的堆空間,有可能通過編譯,但是同樣的也會帶來問題,有可能這個問題會暫時沒出現,因爲用malloc函數申請堆空間時並沒有生成一個合法的物件,而用delete關鍵字就會呼叫解構函式,去呼叫一個不合法物件的解構函式是很可能會出現問題的。
例程1:
#include<iostream>
using namespace std;
int main()
{
int* p1=new int(5);
char* p2=new char('a');
float* p4=new float(2.1f);
cout<<"*p1="<<*p1<<endl;
cout<<"*p2="<<*p2<<endl;
cout<<"*p4="<<*p4<<endl;
delete p1;
delete p2;
delete p4;
int* p3=new int[10];
for(int i=0;i<10;i++)
{
p3[i]=i+1;
cout<<"p3"<<"["<<i<<"]="<<p3[i]<<endl;
}
delete[] p3;
return 0;
}
例程2:
#include <iostream>
#include <string>
#include <cstdlib>//C標準通用實用庫,此檔頭定義了幾個通用功能,包括動態記憶體管理,亂數生成,與環境的通訊,整數算術,搜尋,排序和轉換。
using namespace std;
class Test
{
int* mp;
public:
Test()
{
cout << "Test::Test()" << endl;
mp = new int(100);
cout << *mp << endl;
}
~Test()
{
delete mp;//歸還記憶體空間
cout << "~Test::Test()" << endl;
}
};
int main()
{
Test* pn = new Test;//用c++的方式,申請空間的同時會呼叫建構函式,完成物件的構造
Test* pm = (Test*)malloc(sizeof(Test));//用c語言的方式,只負責申請空間,不負責物件的構造,因此生成的物件不合法
delete pn;//會先呼叫解構函式銷燬物件,然後歸還空間
free(pm);//只負責歸還空間,而不負責銷燬物件
return 0;
}
分析:此處只調用了一個建構函式和解構函式,因此證明了此文開頭的一些結論,這裏也可修改程式驗證其餘的結論,這裏就不一一演示了。