web-dev-qa-db-ja.com

なぜstd :: strstreamは廃止されたのですか?

最近std::strstreamは廃止され、std::stringstream。使ってからしばらく経ちましたが、当時必要だったことをやっていたので、その廃止を聞いて驚きました。

私の質問は、なぜこの決定がなされたのか、そしてどのようなメリットがあるのか​​std::stringstreamは、std::strstream

68
andand

strstreamは、_char *_を返しましたが、どのように割り当てられたのかはどこにも記載されていなかったため、管理が非常に困難でした。したがって、それを削除する必要があるのか​​、free()を呼び出す必要があるのか​​、まったく別のことをするのかを知ることは不可能でした。割り当てを解除する唯一の本当に満足のいく方法については、freeze()関数を介してstrstreamに戻すことでした。これは十分に非自明であり、多くの人が間違ったことをしました。 stringstreamは、それ自体を管理する文字列オブジェクトを返します。これにより、エラーがはるかに少なくなります。

endsを使用して文字列を終了する必要があるという問題もありましたが、割り当て解除の問題が非推奨の主な理由だったと思います。

92
anon

メモリ管理を理解しやすくします。 (割り当てられたメモリを解放する責任者とその条件を誰かが覚えていますか?)

(strstreamはまだ他の場所では利用できないものを提供しているので、C++ 0Xに存在し続けることに注意してください-少なくとも前回ドラフトをチェックしたときは)。

15
AProgrammer

strstreamchar *を構築します。 std::stringstreamstd::stringを構築します。 strstreamsは、std::stringが自動的に防止するバッファーオーバーフローの可能性があるため、非推奨になっていると思います。

11
Ken Bloom

個人的な観点から、複数の機会において、追跡に数日または数週間を要し、最終的にはstrstreamの使用に至った不明瞭なメモリ破損を目にしました。 stringstreamに置き換えられるとすぐに、破損はなくなり、私はそれ以上質問しませんでした!それで十分でした。

7
Component 10