小編給大家分享一下C++之new()和malloc()函數的用法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們提供的服務有:網站設計、網站建設、微信公眾號開發、網站優化、網站認證、微山ssl等。為上千家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的微山網站制作公司
熟悉c++的朋友應該都知道,c++提供給了程序員與硬件打交道的可能性,比如說內存管理。一個高水平的c++程序員可以將c++程序的性能優化到極致,榨干硬件資源。而現在我想說說與內存管理有關的new 和 malloc()。
先說說malloc(),malloc是從C語言那里繼承過來的一個函數,其用于分配一片內存,它的返回結果是一個指向你所需求的內存的指針,其函數原型和使用例子如下:
/* 函數原型 其中__size是你要分配的大小,其單位是byte */ void* malloc(size_t __size); // 用例 int* pInt = (int*) malloc(sizeof(int)); // 分配了一個int double* pDoubleArray = (double*) malloc(sizeof(double) * 5); // 分配了一個double數組,其大小為5
一般來說,malloc總是能為你分配出內存。但是也存在山窮水盡,內存不夠用的情況。這時候malloc會返回一個空指針(NULL, nullptr)。當你使用malloc的時候,你最好每次都要判斷一下返回的指針是否為空。
相關教程:C++視頻教程
現在內存已經分配出來了。當程序運行到某一些時刻,我又不想要這些內存了。這時候我們就要手動釋放內存,否則的話就會造成內存泄露。通過free() 函數來釋放內存,其函數原型和使用例子如下:
// 原型 void free(void* __ptr); // 用例 free(pInt); free(pDoubleArray);
有趣的是你傳給free函數的只是一個指針,然而不管你是分配了一個元素還是分配了一個數組,free總能幫你釋放掉這些內存(free 怎么知道你分配的數組的大小?)
讓我來詳細的說說malloc在分配內存的時候干了什么。malloc在分配內存的時候,不僅僅會分配你需要的內存大小,它還會在你的內存的頭部和尾部加上一些額外的信息(俗稱cookie)。比如說用來DEBUG的信息和你的內存的大小。這就解釋了為什么能free掉你的內存,因為它知道你這塊內存是多大的。值得一提的是這些Cookie會占用一些內存。。。
好了,malloc已經介紹的差不多了。還想說的一點是malloc只是一個第三方的函數,并不是操作系統的內核函數。如果有額外的需求的話,你可以設計自己的malloc。接下來談談new。
new是c++提供的一個操縱符(或者說關鍵字)。其也是用于分配內存的。其用例如下:
int* pInt = new int(3); // 分配并構造一個int double* pDoubleArray = new double[5]; // 分配了一個double數組,其大小是5 delete pInt; // 刪除單元素 delete[] pDoubleArray; // 刪除數組
還是老話題,一般來說程序是能為你分配出內存的,但是實在山窮水盡了怎么辦?這時候程序就會拋出一個std::bad_alloc異常。注意,這是new 和 malloc 的區別之一。但是難能可貴的是C++提供了一個機制來處理bad_alloc異常,其做法如下:
void BadAllocateHandler() { std::cout << "啊,內存分配失敗了" << std::endl; exit(0); } std::set_new_handler(BadAllocateHandler);
BadAllocateHandler是程序員自己寫的當分配失敗時的處理函數。而set_new_handler是c++提供的機制。一般來說當山窮水盡的時候你所應該做的事只有兩件。要么讓程序退出,要么想辦法從別的地方挖一些內存來繼續分配。
你已經知道了new是一個關鍵字。對于一個程序來說,一切的動作都將回到函數調用。所以new的時候到底發生了什么呢?當你new的時候,首先程序會去調用::operator new()這個函數。然后::operator new()中程序會去調用malloc()。喔!一切都明了了,原來new的本質也是去調用malloc函數!!同理,delete的本質是去調用free()函數。
雖然new的本質是去調用malloc,但是new 和 malloc還有一點很大的不同。那就是new 出來內存后,new會幫你把對象給構造出來,而malloc只是分配內存。具體例子如下:
class MyObj { public: public MyObj(int value) : val(value) {} int val; }; MyObj* obj = new MyObj(4); MyObj* obj1 = (MyObj*) malloc(sizeof(MyObj));
new 的做法是在malloc分配出內存后,編譯器會直接調用類的構造函數在這片內存中構造出對象。注意!只有編譯器能直接調用類的構造函數。而你使用malloc的話,是無法直接在上面構造出對象的。
以上是“C++之new()和malloc()函數的用法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!
標題名稱:C++之new()和malloc()函數的用法
文章URL:http://vcdvsql.cn/article28/gjohjp.html
成都網站建設公司_創新互聯,為您提供App設計、外貿建站、關鍵詞優化、軟件開發、動態網站、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯