2010-05-12 159 views
64

我最近發現std::strstream已被棄用,支持std::stringstream。自從我使用它以來已經有一段時間了,但它在那時做了我需要做的事情,所以很驚訝聽到它的貶低。爲什麼不推薦使用std :: strstream?

我的問題是爲什麼做出這個決定,並且std::stringstream提供了std::strstream沒有的好處?

+0

@Chris Lively:你說這只是一個命名約定問題,或者你只是在開玩笑嗎? – andand 2010-05-12 15:24:17

+0

我不確定,但通過Google找到的這個網址可能會有幫助:http://andtes.com/topic/c/answers/158338-streamream-depreciation – 2010-05-12 15:24:44

+1

@andand檢查Exceptional C++,在這裏很好的解釋。 – 2010-05-12 15:26:14

回答

88

strstream返回char *,這是非常難以管理,因爲它沒有說明它是如何分配的。因此不可能知道你是否應該刪除它,或者打電話給free()或者完全做其他事情。關於釋放它的唯一真正令人滿意的方式是通過freeze()函數將其交還給strstream。這是非常不明顯的,很多人都搞錯了。 stringstream返回一個管理自己的字符串對象,這個對象的錯誤更少。

還有一個問題,即不得不使用ends來終止字符串,但我認爲解除分配問題是造成棄用的主要原因。

+1

一個朋友鎖保護訪問器可以解決這個問題,而不需要複製當前解決方案的數據副本。 {std :: bufferguard f(mystream); printf(「%s \ n」,f.str()); } – 2015-04-28 19:27:35

11

A strstream構建了char *。 A std::stringstream構建std::string。由於緩衝區溢出的潛在可能性,我認爲strstream s已被棄用,這是std::string自動阻止的。

+0

strstream實際上並沒有構建char * ...它只是在內部分配的緩衝區末尾添加一個空值。問題是奇怪的訪問者「凍結」......應該作爲一名警衛來實施。 – 2015-04-28 19:28:55

15

更容易理解內存管理。 (有人記得是誰負責釋放分配的內存和在哪些條件下?)

(請注意,由於strstream仍提供其他地方無法提供的某些內容,它將繼續存在於C++ 0X中 - at最少一次我檢查了它的草稿)。

+5

如果你提供緩衝區,你有責任釋放它。如果它提供了緩衝區,它將釋放它,但是你必須記住解凍流,否則它不會。 'c_str = stream.str();/*使用c_str */stream.freeze(false);' – 2010-05-12 15:53:26

7

從不止一次的個人角度來看,我已經看到了模糊的內存損壞,需要幾天或幾周的時間來追蹤並最終歸結爲使用strstream。一旦它被替換爲stringstream,腐敗消失了,我沒有再問任何問題!這對我來說就夠了。

相關問題