プログラムの終了時に例外をスローするアプリケーションがあります。コードがインスタンスstd::stringsで散らかるのを避けるために使用する数値型を変換するためのヘッダーファイルに次のユーティリティ関数がありますstd::ostringstream
namespace MyUtils {
template <typename T>
std::string NumericToString(const T& value)
{
std::string str_retval = "";
try
{
std::ostringstream ost;
ost << value;
str_retval = ost.str();
}
catch (std::exception& e)
{
str_retval = "?";
}
return str_retval;
}
}
現在、このコードは複数のスレッドから呼び出され、頻繁に呼び出され、ostringstream 実装の奥深くでアクセス違反例外をスローすることがあります。このコードからわかることから、スレッドセーフではない明確な理由はわかりません。
Linux (g++ 4.6.3) 用に特別に開発した他のアプリケーション内で同じ関数を使用していますが、コードがスローされるのを見たことがありません。
標準ライブラリ内のスレッド セーフを想定してはならないことはわかっていますが、私の関数はかなり基本的なものです。私のアプリケーションは 64 ビット アプリケーションとしてビルドされているため、このバージョンの XE4 に同梱されている C++11 コンパイラを使用しています。
上記の関数が安全でない理由があるかどうか、または標準ライブラリの Embarcadero C++ ビルダー XE4 実装にこれを安全でないものにする既知の問題があるかどうか、誰か教えてもらえますか?