日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

new/delete和malloc/free读书笔记

發布時間:2025/3/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。