ace服務端程式設計系列的第三篇,**ace解決不同編譯器之間分配堆記憶體的差異。
在ace的官方示例中會看到大量的ace_new_return,ace_new這樣的巨集,這是ace為了消除不同編譯器編譯的**在堆上分配記憶體失敗的行為差異。
具體來說:
使用 malloc/calloc 等分配記憶體的函式時,一定要檢查其返回值是否為「空指標」(亦即檢查分配記憶體的操作是否成功),這是良好的c++程式設計習慣,也是編寫可靠服務端程式所必需的。
如果使用 new 分配記憶體失敗時,c++標準的規定是丟擲異常,如果想檢查記憶體分配是否成功,應該捕捉異常。而一些老的編譯器裡,new 如果分配記憶體失敗,是不丟擲異常的,因為那時 c++ 還沒加入異常機制和制定標準。
為了消除這種不一致性,ace提供了三個巨集,在記憶體分配失敗時採用了malloc的方式,設定為空指標:
ace_new(p,c):使用構造器c分配記憶體,在失敗時p設定為0,並執行return;
ace_new_return(p,c,r):使用構造器c分配記憶體,在失敗時p設定為0,並執行return r;
示例**:
更深一層,如果發生堆記憶體分配失敗,實際上更應該考慮系統中是否存在嚴重的記憶體洩露,而且基本的現代c++編譯器都遵循了標準丟擲異常,對於是否使用ace的這三個巨集大家可以自己選擇。
延伸閱讀:
漫談c++記憶體分配失敗
ACE服務端程式設計2 ACE跨平台之資料型別和寬字元
ace網路庫的主要優勢之一就是跨平台,ace提供了作業系統api和編譯器級別的跨平台解決方法,使開發人員不用再去關心作業系統和編譯器的差異,但因此也帶來了ace的複雜性。而不同的c 編譯器在以下方面也有明顯的差異 1 模版 2 資料型別和寬字元 3 執行時初始化和關閉 4 分配堆記憶體 以上主要參考...
ACE服務端程式設計5 ACE日誌輸出和跟蹤
伺服器程式經常需要在命令列中顯示錯誤訊息 狀態或者用來跟蹤程式的執行路徑,最簡單的方法是使用printf。ace提供了更強大日誌設施 1 可以在編譯時啟用或禁用巨集 2 可以動態的啟用或禁用巨集 3 支援日誌嚴重級別 4 支援日誌重定向 5 支援多執行緒安全和執行緒級配置 使用ace的日誌相關功能,...
基於ACE的網路服務端通訊程式設計
完成了基本的通訊功能 測試報告如下 昨天準備11臺 只有7臺機子可以執行 每個開了10個 大部分 都好的 有1台開10個的時候出錯 還有1臺早上看的時候10個都出錯 根據上面的圖顯示結果來看是由於服務端先關閉,客戶端傳送資料失敗導致。源 如下 class clientacceptor public ...