我最近發現std::strstream
已被棄用,支持std::stringstream
。自從我使用它以來已經有一段時間了,但它在那時做了我需要做的事情,所以很驚訝聽到它的貶低。爲什麼不推薦使用std :: strstream?
我的問題是爲什麼做出這個決定,並且std::stringstream
提供了std::strstream
沒有的好處?
我最近發現std::strstream
已被棄用,支持std::stringstream
。自從我使用它以來已經有一段時間了,但它在那時做了我需要做的事情,所以很驚訝聽到它的貶低。爲什麼不推薦使用std :: strstream?
我的問題是爲什麼做出這個決定,並且std::stringstream
提供了std::strstream
沒有的好處?
strstream
返回char *
,這是非常難以管理,因爲它沒有說明它是如何分配的。因此不可能知道你是否應該刪除它,或者打電話給free()或者完全做其他事情。關於釋放它的唯一真正令人滿意的方式是通過freeze()
函數將其交還給strstream
。這是非常不明顯的,很多人都搞錯了。 stringstream
返回一個管理自己的字符串對象,這個對象的錯誤更少。
還有一個問題,即不得不使用ends
來終止字符串,但我認爲解除分配問題是造成棄用的主要原因。
一個朋友鎖保護訪問器可以解決這個問題,而不需要複製當前解決方案的數據副本。 {std :: bufferguard f(mystream); printf(「%s \ n」,f.str()); } – 2015-04-28 19:27:35
A strstream
構建了char *
。 A std::stringstream
構建std::string
。由於緩衝區溢出的潛在可能性,我認爲strstream
s已被棄用,這是std::string
自動阻止的。
strstream實際上並沒有構建char * ...它只是在內部分配的緩衝區末尾添加一個空值。問題是奇怪的訪問者「凍結」......應該作爲一名警衛來實施。 – 2015-04-28 19:28:55
更容易理解內存管理。 (有人記得是誰負責釋放分配的內存和在哪些條件下?)
(請注意,由於strstream仍提供其他地方無法提供的某些內容,它將繼續存在於C++ 0X中 - at最少一次我檢查了它的草稿)。
如果你提供緩衝區,你有責任釋放它。如果它提供了緩衝區,它將釋放它,但是你必須記住解凍流,否則它不會。 'c_str = stream.str();/*使用c_str */stream.freeze(false);' – 2010-05-12 15:53:26
從不止一次的個人角度來看,我已經看到了模糊的內存損壞,需要幾天或幾周的時間來追蹤並最終歸結爲使用strstream
。一旦它被替換爲stringstream
,腐敗消失了,我沒有再問任何問題!這對我來說就夠了。
@Chris Lively:你說這只是一個命名約定問題,或者你只是在開玩笑嗎? – andand 2010-05-12 15:24:17
我不確定,但通過Google找到的這個網址可能會有幫助:http://andtes.com/topic/c/answers/158338-streamream-depreciation – 2010-05-12 15:24:44
@andand檢查Exceptional C++,在這裏很好的解釋。 – 2010-05-12 15:26:14