欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++之new()和malloc()函數(shù)的用法

小編給大家分享一下C++之new()和malloc()函數(shù)的用法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

我們提供的服務有:網(wǎng)站設計、網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、微山ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的微山網(wǎng)站制作公司

熟悉c++的朋友應該都知道,c++提供給了程序員與硬件打交道的可能性,比如說內(nèi)存管理。一個高水平的c++程序員可以將c++程序的性能優(yōu)化到極致,榨干硬件資源。而現(xiàn)在我想說說與內(nèi)存管理有關的new 和 malloc()。

先說說malloc(),malloc是從C語言那里繼承過來的一個函數(shù),其用于分配一片內(nèi)存,它的返回結(jié)果是一個指向你所需求的內(nèi)存的指針,其函數(shù)原型和使用例子如下:

/*
  函數(shù)原型
  其中__size是你要分配的大小,其單位是byte
*/
void* malloc(size_t __size);

// 用例
int* pInt = (int*) malloc(sizeof(int));               // 分配了一個int
double* pDoubleArray = (double*) malloc(sizeof(double) * 5);   // 分配了一個double數(shù)組,其大小為5

一般來說,malloc總是能為你分配出內(nèi)存。但是也存在山窮水盡,內(nèi)存不夠用的情況。這時候malloc會返回一個空指針(NULL, nullptr)。當你使用malloc的時候,你最好每次都要判斷一下返回的指針是否為空。

相關教程:C++視頻教程

現(xiàn)在內(nèi)存已經(jīng)分配出來了。當程序運行到某一些時刻,我又不想要這些內(nèi)存了。這時候我們就要手動釋放內(nèi)存,否則的話就會造成內(nèi)存泄露。通過free() 函數(shù)來釋放內(nèi)存,其函數(shù)原型和使用例子如下:

// 原型
void free(void* __ptr);

// 用例
free(pInt);
free(pDoubleArray);

有趣的是你傳給free函數(shù)的只是一個指針,然而不管你是分配了一個元素還是分配了一個數(shù)組,free總能幫你釋放掉這些內(nèi)存(free 怎么知道你分配的數(shù)組的大???)

讓我來詳細的說說malloc在分配內(nèi)存的時候干了什么。malloc在分配內(nèi)存的時候,不僅僅會分配你需要的內(nèi)存大小,它還會在你的內(nèi)存的頭部和尾部加上一些額外的信息(俗稱cookie)。比如說用來DEBUG的信息和你的內(nèi)存的大小。這就解釋了為什么能free掉你的內(nèi)存,因為它知道你這塊內(nèi)存是多大的。值得一提的是這些Cookie會占用一些內(nèi)存。。。

好了,malloc已經(jīng)介紹的差不多了。還想說的一點是malloc只是一個第三方的函數(shù),并不是操作系統(tǒng)的內(nèi)核函數(shù)。如果有額外的需求的話,你可以設計自己的malloc。接下來談談new。

new是c++提供的一個操縱符(或者說關鍵字)。其也是用于分配內(nèi)存的。其用例如下:

int* pInt = new int(3);            // 分配并構造一個int
double* pDoubleArray = new double[5];    // 分配了一個double數(shù)組,其大小是5

delete pInt;                   // 刪除單元素
delete[] pDoubleArray;             // 刪除數(shù)組

還是老話題,一般來說程序是能為你分配出內(nèi)存的,但是實在山窮水盡了怎么辦?這時候程序就會拋出一個std::bad_alloc異常。注意,這是new 和 malloc 的區(qū)別之一。但是難能可貴的是C++提供了一個機制來處理bad_alloc異常,其做法如下:

void BadAllocateHandler()
{
  std::cout << "啊,內(nèi)存分配失敗了" << std::endl;
  exit(0);
}

std::set_new_handler(BadAllocateHandler);

BadAllocateHandler是程序員自己寫的當分配失敗時的處理函數(shù)。而set_new_handler是c++提供的機制。一般來說當山窮水盡的時候你所應該做的事只有兩件。要么讓程序退出,要么想辦法從別的地方挖一些內(nèi)存來繼續(xù)分配。

你已經(jīng)知道了new是一個關鍵字。對于一個程序來說,一切的動作都將回到函數(shù)調(diào)用。所以new的時候到底發(fā)生了什么呢?當你new的時候,首先程序會去調(diào)用::operator new()這個函數(shù)。然后::operator new()中程序會去調(diào)用malloc()。喔!一切都明了了,原來new的本質(zhì)也是去調(diào)用malloc函數(shù)!!同理,delete的本質(zhì)是去調(diào)用free()函數(shù)。

雖然new的本質(zhì)是去調(diào)用malloc,但是new 和 malloc還有一點很大的不同。那就是new 出來內(nèi)存后,new會幫你把對象給構造出來,而malloc只是分配內(nèi)存。具體例子如下:

class MyObj {
public:
  public MyObj(int value) : val(value) {}
  int val;
};

MyObj* obj = new MyObj(4);
MyObj* obj1 = (MyObj*) malloc(sizeof(MyObj));

new 的做法是在malloc分配出內(nèi)存后,編譯器會直接調(diào)用類的構造函數(shù)在這片內(nèi)存中構造出對象。注意!只有編譯器能直接調(diào)用類的構造函數(shù)。而你使用malloc的話,是無法直接在上面構造出對象的。

以上是“C++之new()和malloc()函數(shù)的用法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

標題名稱:C++之new()和malloc()函數(shù)的用法
文章URL:http://aaarwkj.com/article28/gjohjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計、外貿(mào)建站、關鍵詞優(yōu)化、軟件開發(fā)、動態(tài)網(wǎng)站網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司
亚洲av日韩av高潮| 亚洲大乳大丰满中文字幕| 亚洲成人av在线播放观看| 偷拍一区二区三区免费| 亚洲三级成人一区在线| 国产毛片一区二区在线| 日韩精品成人亚洲天堂| 一区二区三区乱码国产在线 | 国产精品成人大片在线播放| 91午夜福利视频在线观看| 日韩x级av免费在线观看| 亚洲av毛片一区二区三区网| 激情偷拍一区二区三区视频| 最新国产av网址大全| 亚洲一区二区另类视频| av中文在线免费观看| 成人av影视中文字幕 | 高清白嫩学生自拍视频| 日韩欧美国产综合第一页| 在线不卡日本v二区| 激情自拍偷拍合集一部| 韩国三级在线视频网站| 亚洲国产一区二区精品| 十八禁真人无摭挡观看| 亚洲情欲一级片日韩欧美| 欧美老熟妇精品一区二区| 久久99热这里只频精品| 亚洲综合美女极品啪啪啪| 美女在线观看av少妇| 十八禁在线观看网址免费| 中文字幕国产精品专区| 尤物天堂av一区二区| 久久日韩制服丝袜人妻| 淫色网av人妻中文字幕| 成人午夜福利视频大全| 人妻中文字幕在线一二区| 亚洲成人爱情动作片在线观看| 国产亚洲中文字幕91| 免费看真人性生活视频| 98热这里只有精品视频| 日本少妇入口一区二区|