2013-07-22 7 views
23

मेरे पास एक ऐसा फ़ंक्शन है जो वर्तमान जीएमटी/यूटीसी दिनांक और समय स्ट्रिंग (live example) उत्पन्न करने के लिए बूस्ट.डेटाइम लाइब्रेरी का उपयोग करता है।पहलू को हटाने के लिए कौन जिम्मेदार है?

std::string get_curr_date() { 
    auto date = boost::date_time::second_clock<boost::posix_time::ptime>::universal_time(); 

    boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%a, %d %b %Y %H:%M:%S GMT"); 

    std::ostringstream os; 
    os.imbue(std::locale(os.getloc(), facet)); 
    os << date; 

    return os.str(); 
} 

यह ज्यादातर Boost.DateTime's example पर आधारित है:

//example to customize output to be "LongWeekday LongMonthname day, year" 
//         "%A %b %d, %Y" 
date d(2005,Jun,25); 
date_facet* facet(new date_facet("%A %B %d, %Y")); 
std::cout.imbue(std::locale(std::cout.getloc(), facet)); 
std::cout << d << std::endl; 
// "Saturday June 25, 2005" 

मेरे कोड अच्छी तरह से काम किया है, लेकिन अब मैं इन विशेष लाइनों new युक्त की वजह से असहज महसूस कर रहा हूँ:

  • boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%a, %d %b %Y %H:%M:%S GMT");

  • date_facet* facet(new date_facet("%A %B %d, %Y"));

जैसा कि आप देख सकते हैं, वहाँ है में कोई delete Boost.DateTime की तो मैं किसी भी तरह मान लिया यह मेरे लिए deletedate_facet लिए जरूरी है कि। मैंने new एड time_facet ऑब्जेक्ट को लपेटने के लिए std::unique_ptr का उपयोग किया।

std::unique_ptr<boost::posix_time::time_facet> facet(new boost::posix_time::time_facet("%a, %d %b %Y %H:%M:%S GMT")); 

हालांकि, मैं segfault त्रुटियों हो रही है, जैसा कि आप here में देख सकते हैं। मैंने मैन्युअल रूप से deletenew एड पॉइंटर में भी कोशिश की है, और मुझे अभी भी वही त्रुटियां मिल रही हैं (क्षमा करें, कोलिरु में त्रुटि पुन: उत्पन्न नहीं कर सकती)।

time_facet पॉइंटर std::locale ऑब्जेक्ट का निर्माण करते समय तर्क के रूप में पारित किया जाता है, इसलिए मैं उलझन में हूं कि delete पहलू में कौन जिम्मेदार है।

तो यहाँ

मेरे सवाल की मूल है:

  • मैं deletetime_facet करना आवश्यक है या std::locale वस्तु delete यह ing के लिए कौन जिम्मेदार है?

कृपया ध्यान दें कि boost::posix_time::time_facetboost::date_time::date_facet जो है, बारी में, std::locale::facet से प्राप्त से ली गई है। यह प्रश्न std::locale::facet पर सामान्यीकृत हो सकता है, हालांकि मेरी समस्या time_facet पर विशिष्ट है।

यहाँ std::locale के निर्माताओं पर कुछ डॉक्स हैं:

उत्तर

24

हूँ मैं time_facet नष्ट करने के लिए की आवश्यकता है या std :: लोकेल वस्तु यह deleteing लिए जिम्मेदार है?

आप std::locale::facet से इतने लंबे समय time_facet निकला है के रूप में time_facet नष्ट करने के लिए है, जो यह होना चाहिए की आवश्यकता नहीं कर रहे हैं। std::locale::facet एक आधार वर्ग है कि सभी पहलुओं को उस संदर्भ से प्राप्त करना चाहिए जो संदर्भ गणना के एक रूप को लागू करता है। मानक यह कहते हैं:

§ 22.3.1.6

एक बार एक पहलू संदर्भ use_facet<> को फोन करके एक स्थान वस्तु से प्राप्त होता है, कि संदर्भ प्रयोग करने योग्य रहता है, और इसके बारे में सदस्य कार्यों से परिणाम हो सकता है कैश और पुन: उपयोग किया जाता है, जब तक कि लोकेल ऑब्जेक्ट उस पहलू को संदर्भित करता है।

एक बार पहलू के सभी संदर्भ, इस्तेमाल किया जा रहा नहीं कर रहे हैं std::locale का नाशक पहलू के लिए संदर्भ का प्रबंधन कर दिए जाएंगे और अगर इसके रेफरी गिनती 0.

यह सब §22.3.1.1 में निर्दिष्ट किया जाता है। सी ++ 11 मानक में 2। जहां यह कहता है:

कन्स्ट्रक्टर को रेफरी तर्क आजीवन प्रबंधन के लिए उपयोग किया जाता है।

- refs == 0 के लिए, कार्यान्वयन delete static_cast<locale::facet*>(f) जब अंतिम स्थान पहलू युक्त वस्तु नष्ट हो जाता है (जहां च पहलू के लिए सूचक है) करता है; refs == 1 के लिए, कार्यान्वयन कभी पहलू को नष्ट नहीं करता है।

2

स्थान पहलू को हटाने के लिए जिम्मेदार है।

+0

इसका मतलब है कि लोकेल को 'स्थिर स्थिर' घोषित नहीं किया जा सकता है? – agodinhost

5

आपके प्रश्न का उत्तर नहीं दे रहा है क्योंकि अन्य पहले से ही इसे कर चुके हैं। लेकिन, हर बार लोकेल बनाने के लिए वास्तव में इसकी आवश्यकता नहीं है।

std::string get_curr_date_time() { 
    namespace bpt = boost::posix_time; 
    namespace bdt = boost::date_time; 
    std::ostringstream os; 
    auto date = bdt::second_clock<bpt::ptime>::universal_time(); 
    const static std::locale currlocale (os.getloc(), new bpt::time_facet("%Y%m%d%H%M%S")); 
    boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%a, %d %b %Y %H:%M:%S GMT"); 

    os.imbue(currlocale); 
    os << date; 
    return os.str(); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे