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中有效,因此它可能是一種或多或少地機械修復代碼以使其與所有編譯器相同的方式,因此您不必重新處理現有的錯誤處理。

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];
- 3 回答
- 0 關注
- 745 瀏覽
添加回答
舉報