2012-07-04 15 views
7

शीर्षक मूल रूप से यह सब कहता है, मुझे आश्चर्य है कि जब एक सी ++ वर्ग के स्थिर सदस्य प्रारंभ होते हैं और जब वे दायरे से बाहर जाते हैं।सी ++ स्थैतिक सदस्य परिवर्तनीय दायरा

मुझे निम्न समस्या के लिए इसकी आवश्यकता है। मेरे पास कक्षा फू की कई वस्तुएं हैं और प्रत्येक ऑब्जेक्ट को किसी अन्य क्लास बार द्वारा encapsulated संसाधन तक पहुंच की आवश्यकता होती है। सिंक्रनाइज़ेशन कोई मुद्दा नहीं है, इसलिए मैं सभी ऑब्जेक्ट्स को एक ही बार उदाहरण साझा करना चाहता हूं।

मैं संदर्भ गणना के लिए एक सरल प्रबंधित सूचक का उपयोग कर रहा हूं। लेकिन जब यह होता है -

class Foo { 
private: 
    static managed_pointer<Bar> staticBar; 
public: 
    Foo() { 
     if(!staticBar) 
      staticBar = new Bar; 
    } 
    /* 
    * use staticBar in various non-static member functions 
    */ 
}; 

managed_pointer<Bar> Foo::staticBar = NULL; 

managed_pointer staticBar जैसे ही यह क्षेत्र से बाहर चला जाता है बार वस्तु को हटा देना चाहिए:

मैं निम्न कार्य कर सकते हैं? जब फू का आखिरी उदाहरण नष्ट हो जाता है? आवेदन निकास पर?

आपकी सलाह के लिए धन्यवाद!

+0

ओह, टाइपो को ठीक करने के लिए धन्यवाद। – Pontomedon

+0

फू का अंतिम उदाहरण तब नष्ट हो जाता है जब आप अंतिम उदाहरण को हटाते हैं या जब आपका प्रोग्राम मौजूद होता है। कक्षा के एक स्थिर सदस्य मौजूद होंगे इससे कोई फर्क नहीं पड़ता कि कक्षा के कितने उदाहरण हैं। – Gabi

उत्तर

13

static और वैश्विक प्रारंभ कर रहे हैं सही से पहले कार्यक्रम शुरू होता है (पहले main कहा जाता है, इस कार्यक्रम वास्तव में उस से पहले शुरू होता है) और main रास्ते के बाद क्षेत्र से बाहर चले जाते हैं।

अपवाद - स्थानीय सांख्यिकी (फ़ंक्शंस के अंदर घोषित स्थैतिक चर) और अप्रयुक्त टेम्पलेट वर्ग static सदस्य।

इसका उदाहरणों की संख्या से कोई लेना देना नहीं है।

+0

कार्यक्रम शुरू होने से पहले स्थानीय स्थैतिक चर प्रारंभ नहीं किए जाते हैं। – Gabi

+0

ठीक है धन्यवाद। इसका मतलब क्या है "इसका उदाहरणों की संख्या से कोई लेना देना नहीं है"? कक्षा फू के उदाहरण? – Pontomedon

+1

हां इससे कोई फर्क नहीं पड़ता कि फू के कितने उदाहरण हैं, वे सभी बार साझा करेंगे। –

2

मानक प्रारंभिकरण का सटीक क्रम निर्दिष्ट नहीं करता है, यह कार्यान्वयन विशिष्ट है। कार्यक्रम की शुरुआत में उन्हें तत्काल हटा दिया जाएगा और अंत में हटा दिया जाएगा।

आपको जो कुछ भी कर रहे हैं उससे आपको बहुत सावधान रहना होगा, क्योंकि यदि आपके पास कुछ अन्य स्थिर वस्तुएं हैं जो इस वस्तु पर निर्भर हैं, तो यह यूबी है। इसमें कोई जानकारी नहीं है कि उन्हें किस क्रम में शुरू किया जाएगा।

आप संभवतः बूस्ट :: call_once जैसे कुछ को देख सकते हैं ताकि यह सुनिश्चित हो सके कि यह एक बार शुरू हो गया है, लेकिन मैं आंकड़ों को प्रारंभ करने के क्रम पर भरोसा नहीं करता।

मुझे पता है कि आप कोड काम करेंगे, लेकिन मुझे पहले स्टेटिक प्रारंभिक मुद्दे से काट दिया गया है, इसलिए मैं आपको चेतावनी देना चाहता था।

संपादित करें: आपके कोड में, जब प्रबंधित_प्टर स्कोप (प्रोग्राम के अंत) से बाहर हो जाएगा, तो यह स्वचालित रूप से आवंटित स्मृति को हटा देगा। लेकिन आपको बार के विनाशक में कुछ भी गैर-तुच्छ नहीं करना चाहिए क्योंकि आप अन्य मुक्त उदाहरणों या यहां तक ​​कि कोड को हटाकर यूबी को ट्रिगर कर सकते हैं (जैसा कि एक बार गतिशील पुस्तकालय हटा दिया गया था)। अनिवार्य रूप से आप एक minefield में हैं, तो बाहर देखो।

+0

मेरे पास फू में कोई अन्य 'स्थिर' नहीं होगा, लेकिन चेतावनी के लिए धन्यवाद, एक और विवरण ध्यान में रखना अच्छा है। संपादित करें: दूसरी चेतावनी के लिए भी धन्यवाद, मैं देख लूंगा। – Pontomedon

+0

मेरा मतलब था, आपके * प्रोग्राम * में अन्य स्थिर वस्तुएँ। यदि बाद में आप एक और वस्तु रखने का फैसला करते हैं, तो ReBar कहें, यह भी स्थैतिक है, और आपको लगता है कि "अरे मैं बार कह सकता हूं :: कुछ स्थिर है क्योंकि आपको सावधान रहना चाहिए।" –

+1

आह, ठीक है, मुझे लगता है कि मुझे आपका अंक मिल गया है। – Pontomedon

1

पहली बात यह है कि आपके प्रश्न से बाहर पॉप आम धारणा है कि गुंजाइश और जीवन बराबर अवधारणाओं रहे हैं। वो नहीं हैं। कुछ मामलों में स्थानीय चर के साथ, जीवनकाल एक विशेष संदर्भ से जुड़ा हुआ है, लेकिन यह हमेशा ऐसा नहीं होता है।

एक वर्ग स्थिर सदस्य चर वर्ग गुंजाइश गया है और स्थिर जीवन, जिसका अर्थ है कि यह एक ही में अन्य स्थैतिक चर के संबंध में आदेश में प्रारंभ किया जाएगा (यह सुलभ कहीं भी कार्यक्रम में है) अनुवाद इकाई, और अन्य अनुवाद इकाइयों में अन्य स्थैतिक चर के संबंध में एक अनिर्धारित क्रम में, से पहले मुख्य (चेतावनी: प्रारंभिकरण मुख्य में पहले कथन से पहले नहीं किया जाना चाहिए, लेकिन यह पहले odr- चर के का उपयोग करें)।

+2

एक वर्ग स्थिर सदस्य परिवर्तक _class_ गुंजाइश है: यह केवल उन संदर्भों में दिखाई देता है जहां कक्षा के भीतर नाम दिखाई देते हैं। इसमें स्थिर जीवनकाल है, और बाहरी बाध्यकारी (एक तीसरी अवधारणा जो लोग कभी-कभी आपके द्वारा उल्लेख किए गए दो लोगों के साथ उलझन में हैं)। फिर भी, आपने आवश्यक बिंदु का उल्लेख किया है: आजीवन और गुंजाइश ऑर्थोगोनल अवधारणाएं हैं। (कम से कम एक डिग्री तक। _are_ मामले जहां दायरा जीवनकाल निर्धारित करता है।) –

+0

@ जेम्ससांज: ठीक है, मेरी गलती। इस पर ध्यान दिलाने के लिए धन्यवाद। –

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