new/delete和malloc/free读书笔记
?以前對這兩者的認識是停留在以下表面:
malloc與free是C++/C語言的標(biāo)準庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。new會自動調(diào)用構(gòu)造函數(shù),delete會自動調(diào)用析構(gòu)函數(shù),malloc和free不會。
malloc是個分配內(nèi)存的函數(shù),供你調(diào)用的。
new是保留字,不需要頭文件支持。
malloc需要頭文件庫函數(shù)支持。
new 建立的是一個對象,
malloc分配的是一塊內(nèi)存。
今晚順手寫了個測試代碼
class A { public: A(){cout<<"A()"<<endl ;} const static int num = 0; ~A(){cout<<"~A()"<<endl ;} } ; int _tmain(int argc, _TCHAR* argv[]) { A * p = new A[10]; delete[] p; system("pause"); return 0; }?
?
輸出結(jié)果為
10個A(),10個~A()。
若把代碼改成:
class A { public: A(){cout<<"A()"<<endl ;} const static int num = 0; ~A(){cout<<"~A()"<<endl ;} } ; //int A::num=0; int _tmain(int argc, _TCHAR* argv[]) { //A * p = new A[10]; //delete[] p; A *p = (A*)malloc(10*sizeof(A)); system("pause"); return 0; }
輸出結(jié)果為:
空
相信前兩者一比較,應(yīng)該能深入理解"new會自動調(diào)用構(gòu)造函數(shù),delete會自動調(diào)用析構(gòu)函數(shù),malloc和free不會"。
大家都清楚,構(gòu)造函數(shù)一般來說必須聲明為公有的,這樣才能在類外部創(chuàng)建對象,當(dāng)然,如果你不想在類外創(chuàng)建對象,可以聲明為私有的,比如全是靜態(tài)成員函數(shù)的類,
上述代碼如果修改成
? class A { A(){cout<<"A()"<<endl ;} const static int num = 0; ~A(){cout<<"~A()"<<endl ;} public : void Show(){cout<<"SHOW"<<endl;} } ; int _tmain(int argc, _TCHAR* argv[]) { A * p = new A[10]; delete[] p; system("pause"); return 0; }
會報錯,當(dāng)然你直接寫成A a也是一樣報錯,編譯器會提示你構(gòu)造函數(shù)為私有!。
但是如果寫成這樣呢
class A { A(){cout<<"A()"<<endl ;} const static int num = 0; ~A(){cout<<"~A()"<<endl ;} public : void Show(){cout<<"SHOW"<<endl;} } ; int _tmain(int argc, _TCHAR* argv[]) { A *p = (A*)malloc(10*sizeof(A)); p->Show(); system("pause"); return 0; }
卻能正常顯示"SHOW",兩者一比較
相信現(xiàn)在都能理解"new 建立的是一個對象,malloc分配的是一塊內(nèi)存"這句話的含義了吧,也就是malloc的p是指向了可以容納10個A對象的空間,但內(nèi)存卻沒有創(chuàng)建對象.
再提一個問題:delete[] p;如果改成delete p,結(jié)果會怎么樣呢?
答案是不可預(yù)測的,不可預(yù)測的意思意味著,程序在你編譯時正常,在其他大多數(shù)時候都可能正常,但有可能在最關(guān)鍵的時間崩潰.
解決方法是死記一個準則:如果你調(diào)用new時用了[],調(diào)用delete時也要用[]。如果調(diào)用new時沒有用[],那調(diào)用delete時也不要用[].
再提一個問題:new分配的如果用free釋放呢,或者malloc分配的用delete去釋放呢,答案還是不可預(yù)測的。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hgy413/archive/2010/12/13/3693669.html
總結(jié)
以上是生活随笔為你收集整理的new/delete和malloc/free读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZZ flex preloader
- 下一篇: C#根据字节数截取字符串