おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ファセットを間違って使う

STLの比較的マイナーな部分の話(ちょっと boost::date_time の話も混ざっていますが)なんですが、 boost::posix_time::ptime 型から HTTP のスタイルの日付文字列(こんな感じ→Sun, 06 Nov 1994 08:49:37 GMT)を生成するのに次のようなコードを書いたわけです。このコードの解説ですが、 date オブジェクトである date.date() と、 time_duration オブジェクトである date.time_of_day() のストリームへの出力の方法を、ロケールをカスタマイズにより変更するということをしています。ファセットと言うのはストリームへの書式付き出力を行うオブジェクトでロケールオブジェクトに指定します。
001 std::string http_client::compose_http_date(boost::posix_time::ptime const &date)
002 {
003   std::ostringstream oss;
004 
005   // create date_facet.
006   std::auto_ptr<boost::gregorian::date_facet> date_output(new boost::gregorian::date_facet());
007   oss.imbue(std::locale(oss.getloc(), date_output.get()));
008 
009   // customize date format.
010   date_output->format("%a, %d %b %Y");
011 
012   // create time_facet.
013   std::auto_ptr<boost::posix_time::time_facet> time_output(new boost::posix_time::time_facet());
014   oss.imbue(std::locale(oss.getloc(), time_output.get()));
015 
016   // customize time_duration format.
017   time_output->time_duration_format("%H:%M:%S");
018 
019   // output like Sun, 06 Nov 1994 08:49:37 GMT.
020   oss << date.date() << ' ' << date.time_of_day() << " GMT";
021 
022   return oss.str();
023 }
でも、ここで生成したファセットを auto_ptr に入れたのが間違えでした。そのおかげで、この関数を抜けるときに次のようなエラーメッセージが出てしまいました。
HEAP[http_client.exe]: HEAP: Free Heap block 3a92f0 modified at 3a931c after it was freed
Windows によって http_client.exe でブレークポイントが発生しました。
サンプルコードだけ見て、「new しているけど delete してないな」と思い、安直にスマートポインタを使ってしまったのが運の尽きというやつです(6、13行目)。どうやら、ファセットは ロケールオブジェクトが自動で解放してくれるようです。ということで、次のようにこの部分を普通のポインタに直します。
006   boost::gregorian::date_facet *date_output = new boost::gregorian::date_facet();
007   oss.imbue(std::locale(oss.getloc(), date_output));

013   boost::posix_time::time_facet *time_output = new boost::posix_time::time_facet();
014   oss.imbue(std::locale(oss.getloc(), time_output));
結論としては、ちゃんとリファレンスを読もうということですね(汗)。
  1. 2007/09/16(日) 14:41:25|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<GPIBボードにALTERAの石が | ホーム | パーティションのWindows共有フォルダへのバックアップの仕方>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/207-90c173dc
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。