亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在任何情況下new都會返回NULL嗎?

在任何情況下new都會返回NULL嗎?

C++
慕沐林林 2019-11-30 14:37:51
我知道,根據C ++標準,萬一新的分配內存失敗,應該拋出std :: bad_alloc異常。但是我聽說有些編譯器,例如VC6(或CRT實現?)不遵守它。這是真的 ?我之所以這樣問是因為在每條新語句之后檢查NULL會使代碼看起來非常難看。
查看完整描述

3 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

在這方面,默認情況下VC6不兼容。VC6的new返回0(或NULL)。


這是有關此問題的Microsoft知識庫文章,以及使用自定義new處理程序的建議解決方法:


新操作符不會在Visual C ++中失敗時引發bad_alloc異常

如果您有針對VC6行為編寫的舊代碼,則可以通過鏈接名為的目標文件,使用較新的MSVC編譯器(如7.0及更高版本)來獲得相同的行為nothrownew.obj。在7.0和7.1編譯器(VS2002和VS2003)中,實際上存在一組相當復雜的規則,以確定它們默認是非拋出還是拋出new。


似乎MS在8.0(VS2005)中已將其清除 —現在,除非您專門鏈接到,否則它始終默認為拋出新異常nothrownew.obj。


請注意,您可以使用參數指定要new返回0而不是拋出:std::bad_allocstd::nothrow


SomeType *p = new(std::nothrow) SomeType;

這似乎在VC6中有效,因此它可能是一種或多或少地機械修復代碼以使其與所有編譯器相同的方式,因此您不必重新處理現有的錯誤處理。


查看完整回答
反對 回復 2019-11-30
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

基于C ++規范,當您僅使用沒有參數的普通新函數時,它將始終拋出std :: bad_alloc,但是當然可能會有一些不兼容的編譯器。


我不會編碼為與非c ++兼容的編譯器兼容。VC6在這方面就是其中之一。


最好將指針刪除后再將其設置為NULL。因此,因此仍然需要檢查NULL。


話雖這么說,以下是清理代碼的幾種選擇:


選項1:設置自己的新處理程序


清理代碼的安全方法是先調用:set_new_handler。


然后,您可以在處理程序中檢查NULL,如果返回NULL,則將std :: bad_alloc扔在那里。


如果您更喜歡例外,那么這是您的最佳選擇。如果您希望更好地返回NULL,那么也可以通過在新處理程序內執行catch來實現。


選項2:使用重載的new


C ++標準頭文件定義了一個空的struct nothrow。您可以在new內部使用此結構的對象來獲取其重載版本,該版本始終返回NULL。


void* operator new (size_t size, const std::nothrow_t &);

void* operator new[] (void *v, const std::nothrow_t &nt);

因此,在您的代碼中:


 char *p = new(std::nothrow) char[1024];


查看完整回答
反對 回復 2019-11-30
  • 3 回答
  • 0 關注
  • 745 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號