2010-08-02 27 views
7

Olası Çoğalt:Yeni operatör NULL döndürecek mi?


Will new return NULL in any case?

i sınıf Araba var ve hayır, standartlara uygun C++ uygulaması üzerinde bir nesne

Car *newcar = new Car(); 
if(newcar==NULL) //is it valid to check for NULL if new runs out of memory 
{ 
} 
+2

Yinelenen [Will her durumda yeni dönüş NULL?] (http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case) –

cevap

28

oluşturmak varsayalım. new'un normal formu hiçbir zaman NULL; ayırma başarısız olursa, std::bad_alloc istisnası atılır (new (nothrow) formu istisnalar atmaz ve ayırma başarısız olursa NULL döndürür). (Dil standardize önce yayımlanan özellikle) ya da istisnalar açıkça (örneğin, gömülü sistemler için belki bazı derleyiciler), new başarısızlık üzerine NULL döndürebilir devre dışıdır durumlarda bazı eski C++ derleyici üzerinde

. Bunu yapan derleyiciler C++ standardına uymuyor.

+0

Kesinlikle! C++ içinde yapmanın yolu, try/catch bloklarıdır. İşte bir örnek: http://www.cplusplus.com/reference/std/new/bad_alloc/ – karlphillip

2

Varsayılan olarak, C++, yeni işleç başarısız olduğunda bir std :: bad_alloc istisnası atar. Bu nedenle, istisna kullanımını açıkça devre dışı bırakmadıkça, NULL denetimi gerekli değildir. Atama hatası nedeniyle Hayır, new, std::bad_alloc atar.

+0

... ve istisna kullanımını devre dışı bırakırsanız, dil artık C++ değildir. –

1

Bunu birçok kez gördüm ve neden yeni bir bellek istisnası atacağınızı merak ettim. Sanırım C'de çalışmakta olan ve şimdi C++ olan geliştiricilerden geliyor. arasında

+0

Dünyada ne demek istiyorsun? C'ye bir istisna atmadı, ve bunlardan hiçbiri eğer ne düşündüğünüzün mantıklı olduğundan emin değilim. – Chuck

+4

"Boşluğun kontrol edilmesi," demek istediğini düşünüyorum. –

+0

"boşluğun denetlenmesi", yaygın bir tıkanıklık refleksinin, VC6 programcının o anda "yeni" nin uygulanmasının sebebi, NULL'in geri dönüşünün mantıklı bir şey olduğuna karar verdi. Belki malloc bunu yaptı ve yeni beri malloc ... –

İlgili konular