new/delete和malloc/free读书笔记
?以前對這兩者的認識是停留在以下表面:
malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用于申請動態內存和釋放內存。new會自動調用構造函數,delete會自動調用析構函數,malloc和free不會。
malloc是個分配內存的函數,供你調用的。
new是保留字,不需要頭文件支持。
malloc需要頭文件庫函數支持。
new 建立的是一個對象,
malloc分配的是一塊內存。
今晚順手寫了個測試代碼
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; }?
?
輸出結果為
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; }
輸出結果為:
空
相信前兩者一比較,應該能深入理解"new會自動調用構造函數,delete會自動調用析構函數,malloc和free不會"。
大家都清楚,構造函數一般來說必須聲明為公有的,這樣才能在類外部創建對象,當然,如果你不想在類外創建對象,可以聲明為私有的,比如全是靜態成員函數的類,
上述代碼如果修改成
? 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; }
會報錯,當然你直接寫成A a也是一樣報錯,編譯器會提示你構造函數為私有!。
但是如果寫成這樣呢
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",兩者一比較
相信現在都能理解"new 建立的是一個對象,malloc分配的是一塊內存"這句話的含義了吧,也就是malloc的p是指向了可以容納10個A對象的空間,但內存卻沒有創建對象.
再提一個問題:delete[] p;如果改成delete p,結果會怎么樣呢?
答案是不可預測的,不可預測的意思意味著,程序在你編譯時正常,在其他大多數時候都可能正常,但有可能在最關鍵的時間崩潰.
解決方法是死記一個準則:如果你調用new時用了[],調用delete時也要用[]。如果調用new時沒有用[],那調用delete時也不要用[].
再提一個問題:new分配的如果用free釋放呢,或者malloc分配的用delete去釋放呢,答案還是不可預測的。
?
?
轉載于:https://www.cnblogs.com/hgy413/archive/2010/12/13/3693669.html
總結
以上是生活随笔為你收集整理的new/delete和malloc/free读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZZ flex preloader
- 下一篇: makefile格式-实践一