2012-05-16 15 views
7

में एक स्थिर सूचक शुरु कर रहा है मैं एक स्थिर सदस्य है कि इतने की तरह एक सूचक के साथ एक वर्ग है:सी ++

animation.h

class Animation 
{ 
public: 
    Animation(); 
    static QString *m; 

}; 

animation.cpp

#include "animation.h" 

QString* Animation::m = 0; 

Animation::Animation() 
{ 
} 

जब मैं कोशिश इस तरह की 'एम' पॉइंटर को अन्य वर्ग से शुरू करने के लिए:

Animation::m = new QString("testing"); 

यह काम करता है।

लेकिन जब मैं इसे इस तरह कार्य करें:

QString x("Testing"); 
Animation::m = &x; 

कार्यक्रम दुर्घटनाओं।

इस दूसरी विधि के साथ क्या गलत है?

इसके अलावा मैं उस स्थिर सूचक को निजी के रूप में रखना चाहता हूं ताकि मैं स्थिर गेटर और सेटर कार्यों को कर सकूं। सेटर को दूसरी विधि का उपयोग करना चाहिए क्योंकि 'एक्स' पैरामीटर में आ जाएगा, इसलिए मैं फंस गया हूं।

किसी भी मदद के लिए धन्यवाद!

उत्तर

12

मुझे लगता है कि यह उस रेखा पर दुर्घटनाग्रस्त नहीं है, लेकिन बाद में।

समस्या यह है कि आप स्वचालित मेमोरी में स्थित एक चर का पता ले रहे हैं, और शायद बाद में इसे एक्सेस करने का प्रयास करें। वैरिएबल x स्कॉप्स समाप्त होने पर नष्ट हो जाएगा, लेकिन Animation::m अभी भी उस स्मृति को इंगित करेगा (स्मृति जो अब x के दायरे से बाहर नहीं है)। इसके परिणामस्वरूप अपरिभाषित व्यवहार में परिणाम। निम्नलिखित

वैसे ही जैसे अवैध होगा:

QString x("Testing"); 
*(Animation::m) = x; 
+0

यह निश्चित रूप से इसका उत्तर देता है धन्यवाद! –

+0

'* (एनीमेशन :: एम) = एक्स; 'एक' 0' सूचक का वर्णन करता है। सूचक को कभी आवंटित नहीं किया गया था, इसे अभी' 0' में शुरू किया गया था। –

+0

@ एएलएस ने इसे याद किया, सही किया। धन्यवाद। –

2

:

int* x = NULL; 
{ 
    int k = 3; 
    x = &k; 
} 
*x = 4; 

वर्कअराउंड मूल्य, नहीं सूचक (बशर्ते वह पहले से एक वैध QString* को सौंपा गया था) के लिए आवंटित इस दूसरी विधि के साथ क्या गलत है?

यह क्रैश हो जाता है क्योंकि आप संभवतः उस क्षेत्र से अधिक तक पहुंच सकते हैं जिसमें x बनाया गया था। एक बार नियंत्रण, गुंजाइश {} जिसमें वे बनाए गए थे बाहर निकालता है क्या आपके पास तो दायरे से बाहर डेटा जो मौजूद नहीं है के लिए एक सूचक की ओर इशारा करते है

स्वत: चर स्वचालित रूप से नष्ट कर रहे हैं। इस डेटा तक पहुंचने से एक अपरिभाषित व्यवहार और दुर्घटना हो जाती है।

इसके बारे में कैसे जाना है?

आपको गतिशील रूप से स्मृति आवंटित करना चाहिए और फिर स्ट्रिंग को गतिशील रूप से आवंटित पॉइंटर पर प्रतिलिपि बनाना चाहिए ताकि आप इसे हर जगह एक्सेस कर सकें। इस तरह स्ट्रिंग तब तक वैध बनी हुई है जब तक स्पष्ट रूप से delete एड नहीं।

1

मैं शर्त लगाता हूं कि का उपयोग करने के बाद Animation::m का उपयोग करते समय आपका प्रोग्राम क्रैश हो जाता है (संभवत: गुंजाइश से बाहर जाकर)।

आप Animation::m को आवंटित करने के लिए एक सेटर का उपयोग करना चाहते हैं, तो आप एक सूचक के रूप में या संदर्भ द्वारा बहस में उत्तीर्ण होना होगा:

class Animation 
{ 
public: 
    Animation(); 

    void set_m(QString* ptr) { 
     m = ptr; 
    } 

    void set_m(QString& ref) { 
     m = &ref; 
    } 

private: 
    static QString *m; 

}; 

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