2011-07-06 66 views
0

我分配std::ostream *pout_ = output_.get();
其中output_scoped_ptr<std::stringstream> output_;如何找到ostream的類的最大尺寸在C++中

分配我正在填充*pout_ <<"large strings"; APPX 1172528個字符之後。

但在一定程度上我不能在*pout_內插入字符。我試圖在網上衝浪什麼是這個類的最大尺寸,但無法找到。

有人請告訴我最多可以存儲多少個字符*pout_。有沒有什麼函數可以告訴我這個類的最大尺寸?

+1

流不是容器;他們不會存儲任何東西。相反,它們是data_的_flows。 (你的意思是談論底層緩衝區,我確信!) –

+1

1172528肯定是一個確切的近似;) – larsmoa

+0

感謝糾正我..然後,如果數據流經它們,那麼有多少數據可以流動或下拉緩衝區可以存儲多少? – SPB

回答

1

有幾種可能的原因輸出到ostream失敗。 最明顯的是底層支持媒體(內存, case的std::ostringstream)已滿。另一個原因是你已經達到了一些內部限制:很多系統都有(或有)文件大小限制,這些限制在磁盤滿了之前很久就會碰到你,而且有些系統對內存中的單個對象有類似的限制而 std::stringbuf類通常將其數據保存在單個對象中)。 (還有一個硬件錯誤的方法可行,但如果發生這種情況 與std::stringbuf,即一個內存錯誤,硬件可能不會 檢測到它。)

所有這些意味着沒有硬性限制爲多少你可以 寫入一個流,字符串或其他。這完全取決於,有一次,您可能會成功寫入2 GB,並且下一次在1 MB或更少之後失敗。 實際上,在大多數情況下,您應該意識到事實 寫入可能失敗,測試結果(在最後沖洗之後)並且準備好做一些合理的事情,如果他們這樣做的話。

在字符串流的特定情況下,當然,您可能能夠檢測到的唯一的 故障是內存不足。 (安 ostream傳播從streambuf異常;當一個人出現時 設置badbit,如果異常已經啓動 爲badbit,它會拋出自己的異常,而不是重新拋出原來 其中一個手段。那std::bad_alloc不會傳播出去。)
許多應用程序不處理內存不足,並應邏輯 已設置新處理程序中止。如果您已將新處理程序設置爲 中止,那麼您可能可以放棄對字符串 輸出的此類錯誤檢查。

0

這取決於多種因素的數量巨大,如

  • 什麼負載地址爲您選擇使用的共享對象
  • 你的程序的其它部分使用的內存
  • 有多嚴重碎片化您的地址空間已變爲

這就是爲什麼您無法在網上找到任何記錄的限制。

1

答案取決於你的編譯器,平臺等等。它還取決於你寫東西到stringstream的方式(因爲它可能需要爲其緩衝區重新分配內存,可能導致內存碎片並因此被利用不足) 。

想要了解極限的唯一實用方法是在目標環境中進行真實的實驗。即使那樣,你也應該只使用這些實驗的結果作爲粗略的指導。

+0

+1提到的依賴關係。我運行[這個相關的問題]中找到的代碼(http://stackoverflow.com/questions/12166826/stringstream-overflow-at-4gb),發現它在我的Mac上崩潰在3GB,因爲它使用重新分配的方式。 – ecotax

1

stringstream將數據存儲在內存緩衝區中。只要需要,它會根據需要增加緩衝區。

您可以繼續寫入它,直到內存不足。沒有固定的限制。