2017-06-01 29 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超出範圍時可能會將其刪除。

我正確嗎?

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

簡短的回答:否,但的std :: Locale對象確實

你想被看http://en.cppreference.com/w/cpp/locale/locale/locale

要調用構造函數(過載7)

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

鏈接的參考是明確的:

超載7通常被稱作其第二個參數f從新表達式直接獲得 :區域設置負責調用 從其中刪除匹配項自己的析構函數。

所以,是的,事情會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和真實事物之間的中間 - 但差別很小)。 –

相關問題