c++ new_handler空間分配失敗處理
動態分配空間、記憶體動態分配與**對於任何乙個程式設計師來說都尤為重要,特別是嵌入式c/c++程式設計師更為如此,malloc, remalloc, new等等,很有可能就申請空間失敗,對申請失敗的異常處理更是比較棘手。在c++中提倡使用new來代替malloc,因為new比malloc更加安全,更加效率。
很多程式設計師,包括我自己都喜歡性的使用這種c/c++**來申請空間。
c++中,這裡有問題嗎?c程式設計師來說一般都會寫類似的**。
c++中,很多錯誤都會以異常的方式丟擲,而且對於乙個稍大的專案來說異常處理通常會設計專門的異常類去處理。
在《effective c++》中則提到了乙個比較智慧型的使用異常的方式去處理動態分配空間失敗:
他們被定義在
new_handler和set_new_handler的申明如下:
new_handler是乙個引數為空的函式指標。
set_new_handler就是設定異常處理函式的入口,有程式設計師自己定義然後傳入。
當空間分配失敗之後,就會呼叫new_handler異常處理函式,然後才會丟擲異常。也就是說異常的丟擲是在呼叫new_handler之後。
對於乙個動態記憶體分配失敗的異常處理函式應該至少具有以下幾個特點:
1.確保記憶體分配成功。
所謂確保記憶體分配成功,也就是說當new的時候不會失敗。這是乙個策略問題。我們可以在呼叫new之前,就申請一塊較大的空間,當new空間的時候,就是放一點
2.設定不同的new_handler。
對於這一點,我們可以通過改變new_handler的引數以及申請空間的數量來做到。以確保下次申請空間成功。
3. 解除new_handler。
即傳入null指標。
4.異常丟擲。
那麼。實際上,以上4點,set_new_handler已經可以做到了。
實際上,如果new_handler中沒有abort的話,new_handler會被迴圈的呼叫下去,直到申請空間成功為止。
空間分配擔保
新生代採用的複製演算法,留空乙個 survivor 作為空間備份,當大量物件在 minor gc後仍然存活,survivor 無法放下,則會直接進入老年代,需要老年代的空間保證能容納得下這些物件。空間擔保比較的是 老年代最大的連續空閒空間 和 年輕代所有物件的記憶體大小 或 歷次晉公升到老年代的平均...
分配記憶體空間
void calloc size t nobj,size t size 分配足夠的記憶體給nobj個大小為size的物件組成的陣列,並返回指向所分配區域的第乙個位元組的指標 若記憶體不夠,則返回null.該空間的初始化大小為0位元組.char p char calloc 100,sizeof cha...
動態儲存空間分配
include include include c 操作符new用來進行動態記憶體分配 他的值為乙個指標指向所分配的空間 c 操作符delete 用來釋放由操作符new所分配的空間 int y new int,y 10 或者int y new int 10 或者 int y y new int 10...