溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-12-02 10:00:28 來源:億速云 閱讀:580 作者:小新 欄目:編程語言

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

熟悉c++的朋友應(yīng)該都知道,c++提供給了程序員與硬件打交道的可能性,比如說內(nèi)存管理。一個高水平的c++程序員可以將c++程序的性能優(yōu)化到極致,榨干硬件資源。而現(xiàn)在我想說說與內(nèi)存管理有關(guān)的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)。當(dāng)你使用malloc的時候,你最好每次都要判斷一下返回的指針是否為空。

相關(guān)教程:C++視頻教程

  現(xiàn)在內(nèi)存已經(jīng)分配出來了。當(dā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ù)組的大???)

  讓我來詳細(xì)的說說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ù)。如果有額外的需求的話,你可以設(shè)計自己的malloc。接下來談?wù)刵ew。

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

int* pInt = new int(3);            // 分配并構(gòu)造一個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是程序員自己寫的當(dāng)分配失敗時的處理函數(shù)。而set_new_handler是c++提供的機制。一般來說當(dāng)山窮水盡的時候你所應(yīng)該做的事只有兩件。要么讓程序退出,要么想辦法從別的地方挖一些內(nèi)存來繼續(xù)分配。

  你已經(jīng)知道了new是一個關(guān)鍵字。對于一個程序來說,一切的動作都將回到函數(shù)調(diào)用。所以new的時候到底發(fā)生了什么呢?當(dāng)你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會幫你把對象給構(gòu)造出來,而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)用類的構(gòu)造函數(shù)在這片內(nèi)存中構(gòu)造出對象。注意!只有編譯器能直接調(diào)用類的構(gòu)造函數(shù)。而你使用malloc的話,是無法直接在上面構(gòu)造出對象的。

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI