1. new在申請記憶體失敗時的處理方式:
丟擲乙個bad_alloc異常。
// new delete
void * operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
// array new delete
void * operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
// placement new delete
void * operator new(std::size_t, void *) throw();
void operator delete(void *, void *) throw();
// placement array new delete
void * operator new(std::size_t, void *) throw();
void operator delete(void *, void *) throw();
3. 在new操作族中,只有負責記憶體申請的opperator new才會丟擲異常std::bad_alloc。
4. 按照c++標準,如果想檢查new是否成功,應該捕獲異常:
try
catch (const bad_alloc & e)
5. c++標準中的另一種可選形式operator new —— nothrow:
// new delete
void * operator new(std::size_t, std::nothrow_t const &) throw();
void operator delete(void *, std::nothrow_t const &) throw();
// array new delete
void * operator new(std::size_t, std::nothrow_t const &) throw();
void operator delete(void *, std::nothrow_t const &) throw();
6. 採用不丟擲異常的new形式:
int * pstr = new(std::nothrow) string[size];
if(pstr == null)
7. 慎用nothrow new:
operator new的nothrow版本首先分配記憶體,失敗則返回null指標;成功則呼叫建構函式進行初始化;此時,如果建構函式中使用operator new的普通版本時,仍然可能會丟擲異常,且異常像被普通operator new丟擲的異常一樣在系統裡傳播。所以,使用nothrow new只能保障operator new不會丟擲異常,無法保障「new(std::nothrow) classname」這樣的表示式不會丟擲異常。所以,慎用nothrow new。
new記憶體失敗後的正確處理
應該有很多的程式設計師對比爾蓋茨的這句話有所耳聞 對於任何乙個人而言,640kb應當是足夠的了。640k ought to be enough for everybody.不幸的是,偉大的比爾蓋茨也失言了。隨著硬體水平的發展,記憶體變得越來越大,但是似乎仍不能滿足人們對記憶體日益增長的需求。所以呢,...
手機進水後的正確處理方法
toc如果手機不小心進水了。別慌,以下根據進水程度不同分別介紹處理方法。手機輕度進水,手機輕度進水指的是少量水灑到螢幕,外殼位置,這種情況一般是下雨雨滴,或者洗手後用手機時手上殘餘的水。這種情況如果水沒有滴入耳機孔裡面或者充電口裡面就沒事,無需特別處理,用紙巾擦乾就可以。如果有水滴入聽筒裡,聽筒音量...
C new 失敗的處理
我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new int...