2010-07-27 14 views
5

क्या यह अवैध/खतरनाक है?स्टेटिक वैरिएबल पॉइंटर?

int* static_nonew() 
{ 
    static int n = 5; 
    return &n; 
} 

संकलक इसके साथ एक समस्या है प्रतीत नहीं होता है, लेकिन सूचक स्थान ही ओवरराइट जा रहा है जब किसी और स्मृति की आवश्यकता से सुरक्षित है?

संपादित करें: मैंने इस प्रश्न से पूछा क्यों एक स्पष्टीकरण का थोड़ा और अधिक। नोट: मैं सी ++ में प्रोग्रामिंग कर रहा हूं, मैंने इसे सी के रूप में टैग किया है क्योंकि यह सी ++ प्रश्न से सी की अधिक प्रतीत होता है।

मेरे पास एक कक्षा है जो एक स्थिर मानचित्र वापस करने वाला है। मैं केवल इस मानचित्र को कार्यक्रम में एक बार शुरू करना चाहता हूं क्योंकि ऐसा कई बार करने की आवश्यकता नहीं है।

static std::map<std::string, Transition*> transitions; 
static Transition trans1(transitions, ...); 
static Transition trans2(transitions, ...); 
return &transitions; 

संक्रमण वर्गों निर्माता बदलाव करने के लिए खुद को जोड़ना होगा: इस कारण से, मैं इस तरह कुछ है करने के लिए जा रहा था। इस तरह, यह एक बार संक्रमण बना देगा और फिर उन्हें एक सूचक वापस कर देगा। मुझे बस याद है कि यदि आप ढेर पर आवंटित चर के संदर्भ बनाते हैं, तो यह बहुत आसानी से ओवरराइट हो सकता है और "असुरक्षित" था। मैं बस थोड़ा उलझन में था कि फ़ंक्शन के काम में स्थिर चर कैसे बनाए गए थे।

+0

यदि आपके मानचित्र को क्लाइंट कोड द्वारा बदला जाने की उम्मीद नहीं है तो आपको एक कॉन्स संदर्भ या एक कॉन्स्टेंट के लिए पॉइंटर वापस करना चाहिए। इससे स्थिर डेटा से जुड़े अधिकांश जोखिमों को खत्म कर दिया जाएगा। –

उत्तर

5

यह मान्य कोड है, और उपयोगी है।

इस तरह के कई सिंगलटन-कारखानों का निर्माण किया गया है।

6

यह एक स्थैतिक चर के सूचक के लिए सिर्फ एक कार्य है। इसके बारे में कुछ भी अवैध नहीं है। यह आंतरिक रूप से किसी अन्य प्रकार के स्थिर डेटा की तुलना में अधिक खतरनाक नहीं है।

लेकिन स्थिर डेटा:

  1. तंग युग्मन
  2. सूक्ष्म कीड़े के लिए अवसर प्रदान करता है
  3. अक्सर कमजोर डिजाइन का एक संकेत है बनाता है
  4. बाधित फिर से entrancy
  5. बहुत इस्तेमाल किया जाना चाहिए समझदारी से

स्थैतिक भंडारण कक्षा संशोधक का मतलब है कि प्रक्रिया के जीवन के लिए स्मृति इस चर के लिए आरक्षित होगी।

+0

+1: एकमात्र उत्तर जिसमें बहु-थ्रेडिंग समस्याओं का उल्लेख किया गया है (पुन: प्रवेश) – smerlin

+0

+1: यह गैरकानूनी नहीं है, लेकिन यह बहुत ही खतरनाक है। – Puppy

-1

मान लिया जाये कि आप int* static_nonew()

मतलब कर लेने के बाद आप किसी भी स्मृति स्थान के लिए सूचक लौटा दिया है, तो है कि स्मृति ओवरराइट किया जा सकता है, वहाँ सी में कोई सुरक्षा नहीं की गारंटी देता है

इसके अलावा, अगर आप पारित कर रहे हैं यह सूचक free पर, व्यवहार अपरिभाषित है, इसलिए कभी-कभी यह ठीक रहेगा, और कभी-कभी यह कोर को डंप कर देगा।

दूसरी तरफ यह पूरी तरह से कानूनी कोड है। इसके अलावा, int को struct पर प्रतिस्थापित करें जिसे आपको एक बार आरंभ करने की आवश्यकता है, और यह एक बहुत उपयोगी मुहावरे है।

+0

"कभी-कभी यह ठीक रहेगा" बहुत भ्रामक है। यहां तक ​​कि अगर यह ** लगता है ** ठीक है खतरनाक स्मृति भ्रष्टाचार की संभावना है। –

+0

@ आर .. क्या आप पूरी सजा पढ़ सकते हैं? मुझे लगता है कि अगर यह कोर-डंप कहता है तो इसका तात्पर्य है कि यह खतरनाक है। और, क्योंकि व्यवहार समाप्त हो गया है, कभी-कभी इसका कोई साइड इफेक्ट नहीं होगा। –

1

यह कानूनी है लेकिन याद रखें कि आपके पास कभी भी संक्रमण का एक उदाहरण होगा और यह आपके मुख्य() से पहले बनाया जाएगा क्योंकि इसे स्थैतिक घोषित किया गया है। यह एक वैश्विक चर होने की तरह काफी सुंदर है।

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