回答此問(wèn)題時(shí),照下面順序回答:
1、malloc? free是庫(kù)函數(shù),new? delete是運(yùn)算符。
?
2、malloc free只是申請(qǐng)/釋放內(nèi)存,不能構(gòu)造和析構(gòu)對(duì)象;new? free可以申請(qǐng)/釋放內(nèi)存,構(gòu)造/析構(gòu)對(duì)象。
?
3、舉例說(shuō)明第2點(diǎn):
#include <iostream> #include <stdlib.h> using namespace std; class Test { public: int a; Test() { a = 1; } }; int main() { Test *pTestNew = new Test[3]; Test *pTestMalloc = static_cast<Test*>( malloc (3 * sizeof (Test))); cout << pTestNew[0].a << endl; //1 cout << pTestMalloc[0].a << endl; //隨機(jī)數(shù) return 0; }
4、malloc申請(qǐng)內(nèi)存失敗返回NULL,new申請(qǐng)內(nèi)存失敗則拋出異常(1993年以前也是返回0,現(xiàn)在要使用返回0時(shí),new的入口點(diǎn)采用nothrow對(duì)象)。
class widget { ... }; widget *pw1 = new widget;// 分配失敗拋出std::bad_alloc if if (pw1 == 0) ... // 這個(gè)檢查一定失敗 widget *pw2 = new (nothrow) widget; // 若分配失敗返回0 if (pw2 == 0) ... // 這個(gè)檢查可能會(huì)成功
5、new operator = operator new + placement new
new operator就是上面講的new.
new operator(申請(qǐng)內(nèi)存+構(gòu)造對(duì)象) = operator new(申請(qǐng)內(nèi)存) + placement new(構(gòu)造對(duì)象)
?
(1)operator new若一次沒(méi)申請(qǐng)成功,則一直在申請(qǐng)內(nèi)存,直到new_handler為空拋出異常。
operator new的偽代碼看起來(lái)會(huì)象下面這樣:
void * operator new(size_t size)??????? // operator new還可能有其它參數(shù)
{??????????????????????????????????????
? if (size == 0) {????????????????????? // 處理0字節(jié)請(qǐng)求時(shí),
??? size = 1;?????????????????????????? // 把它當(dāng)作1個(gè)字節(jié)請(qǐng)求來(lái)處理
? }????????????????????????????????????
? while (1) {
??? 分配size字節(jié)內(nèi)存;
??? if (分配成功)
????? return (指向內(nèi)存的指針);
??? // 分配不成功,找出當(dāng)前出錯(cuò)處理函數(shù)
??? new_handler globalhandler = set_new_handler(0);
??? set_new_handler(globalhandler);
??? if (globalhandler) (*globalhandler)();
??? else throw std::bad_alloc();
? }
}
?
(2)placement new的使用。placement new構(gòu)造對(duì)象,已申請(qǐng)的內(nèi)存buffer指向該構(gòu)造函數(shù)。
class Widget { public: Widget( int widgetSize); }; Widget* constructWidgetInBuffer( void *buffer, int widgetSize) { return new (buffer) Widget(widgetSize); }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
