C new記憶體失敗後的正確處理

2021-06-09 23:40:17 字數 1611 閱讀 2697

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...