2017-06-01 4 views
3

私はBoostを使用して、 "01-Jan-2000"という形式の日付をジュリアン番号に変換しています。私がこれを行う方法は、使用することです。std :: istringstream :: imbueは渡されたオブジェクトを所有していますか

int toJulian(std::string date) 
{ 
    std::locale loc = std::locale(std::locale::classic(), new boost::posix_time::time_input_facet("%d-%b-%Y")); 
    std::istringstream ss(date); 
    ss.imbue(loc); 
    boost::posix_time::ptime p; 
    ss >> p; 
    return p.date().julian_day(); 
} 

(これはBoostのドキュメントの例の行に沿っています)。

しかし、このメモリが漏れているかどうかはわかりません。私は明示的にdeleteを持っていません。明らかにimbuelocのポインタの所有権をストリームに渡す場合は、おそらくssが範囲外になると削除されます。

正しいですか? ありませんが、のstd ::ロケールオブジェクトは、を行います。

http://www.boost.org/doc/libs/1_43_0/doc/html/date_time/date_time_io.html#date_time.format_flags

+0

cppreferenceの例では、 'Facet'も削除されていないようです。それに言及していないことに興味があります。通常、私は未加工のポインタが所有していないことを意味すると思います... –

+0

@BartekBanachewicz:これであなたの雷を盗んだ:cppreference.comにはロケールの削除を示すメモがあります。 – Bathsheba

答えて

4

短い答えを参照してください。

あなたがリンクされ、参照がクリアされているコンストラクタ(過負荷7)

template< class Facet > 
locale(const locale& other, Facet* f); 

を呼び出しているhttp://en.cppreference.com/w/cpp/locale/locale/locale

を見ていることにしたい。

過負荷7は、一般的にそのと呼ばれています第2引数fは、new-expressionから直接 を取得しました。ロケールは、 と一致する削除を呼び出します独自のデストラクタ。

そうです、何かがあなたのためのオブジェクトをdeleteますが、それは実際にそれをしないstd::localeインスタンスだ、ないストリーム。

+0

対応する標準見積もりを検索しようとしましたが、できませんでした(25.3.1.1.2.3を除く) –

+1

私はいたずらな猫です:私はen.cppreference.comを標準として扱います。しかし、私は標準引用符を含むあなたの答えをアップアップします;-) – Bathsheba

+0

22.3.1.1.2 [locale.facet]は、 'facet'コンストラクタがファセットを削除すべきかどうかを示すフラグない。 (フラグはデフォルトで削除されます)。それは 'boost :: posix_time :: time_input_facet'がどのように基本クラスのコンストラクタを呼び出すかによって異なります。 (私は標準としてn4296を使用していますが、これはcppreferenceと実際のものの中間ですが、違いはかなり小さいです)。 –

関連する問題