2009-02-18 8 views
17

हम अपने अधिकांश कोड में सीएसटींग कक्षा का उपयोग कर रहे हैं। हालांकि कभी-कभी हमें एक char * में कनवर्ट करने की आवश्यकता होती है। फिलहाल हम वैरिएबल का उपयोग कर ऐसा कर रहे हैं। गेटबफर (0) और ऐसा लगता है (यह मुख्य रूप से तब होता है जब एक फ़ंक्शन में सीस्टिंग को पास किया जाता है जहां फ़ंक्शन को char * की आवश्यकता होती है)। समारोह इसे स्वीकार करता है और हम चलते रहते हैं।सीएसटींग से चार *

हालांकि हम हाल ही में चिंतित हैं कि यह कैसे काम करता है, और क्या ऐसा करने का एक बेहतर तरीका है।

जिस तरह से मैं इसे काम करने के लिए समझता हूं वह यह फ़ंक्शन में एक चार सूचक होता है जो सीएसटींग में पहले वर्ण पर इंगित करता है और सभी अच्छी तरह से काम करता है।

मुझे लगता है कि हम मेमोरी लीक या किसी भी अवांछित परिस्थितियों के बारे में चिंतित हैं जहां यह एक अच्छा विचार नहीं हो सकता है।

उत्तर

24

पुनःआवंटन लिए यदि आपके कार्यों केवल स्ट्रिंग पढ़ने और इसे संशोधित नहीं की आवश्यकता होती है, उन्हें const char *char * के बजाय स्वीकार करने के लिए बदलने के releasebuffer कॉल करने के लिए की जरूरत है। CString स्वचालित रूप से आपके लिए रूपांतरित हो जाएगा, इस प्रकार एमएफसी कार्यों में से अधिकांश काम करते हैं और यह वास्तव में आसान है। (असल में एमएफसी LPCTSTR का उपयोग करता है, जो const TCHAR * के लिए समानार्थी है - एमबीसी और यूनिकोड दोनों के लिए काम करता है)।

यदि आपको स्ट्रिंग को संशोधित करने की आवश्यकता है, तो GetBuffer(0) बहुत खतरनाक है - यह परिणामी स्ट्रिंग के लिए पर्याप्त स्मृति आवंटित नहीं करेगा, और आप कुछ बफर ओवररन त्रुटियों को प्राप्त कर सकते हैं।

जैसा कि अन्य लोगों द्वारा उल्लेख किया गया है, आपको GetBuffer के बाद ReleaseBuffer का उपयोग करने की आवश्यकता है। आपको const char * पर रूपांतरण के लिए ऐसा करने की आवश्यकता नहीं है।

+0

मैंने strtol() को ट्रिड किया है और यह स्वचालित रूप से CString से const char * में परिवर्तित नहीं होता है। आप उसे कैसे करते हैं? मैंने टाइप कास्ट भी करने की कोशिश की, या तो काम नहीं करता है। – henryyao

+0

@henryyao इसके बजाय '_tcstol' का उपयोग करें। –

+0

सही काम करता है !!! – henryyao

3

जब आप गेटबफर फ़ंक्शन को कॉल करते हैं तो यह आपके लिए स्मृति आवंटित करता है। जब आप इसे के साथ किया है, तो आप इसे

8

@ ओपी: >>> मैं अनुमान हम सिर्फ मेमोरी लीक या किसी के बारे में चिंतित हैं ...

हाय, GetBuffer विधि कॉल करने वाले किसी मेमोरी लीक लिए नेतृत्व नहीं करेंगे। क्योंकि विनाशक वैसे भी बफर को रद्द करने जा रहा है। हालांकि, दूसरों ने आपको इस विधि को बुलाए जाने वाले संभावित मुद्दों के बारे में पहले से ही चेतावनी दी है।

@ कान >>>जब आप गेटबफर फ़ंक्शन को कॉल करते हैं तो यह आपके लिए स्मृति आवंटित करता है।

यह कथन पूरी तरह से सत्य नहीं है। GetBuffer (0) कोई स्मृति आवंटित नहीं करता है। यह केवल आंतरिक स्ट्रिंग बफर के लिए एक सूचक देता है जिसका उपयोग सीएसटींग कक्षा से "बाहर" स्ट्रिंग में हेरफेर करने के लिए किया जा सकता है।

हालांकि, यदि आप कोई संख्या पास करते हैं, तो इसे गेटबफर (एन) की तरह एन कहते हैं, और यदि एन बफर की वर्तमान लंबाई से बड़ा है, तो फ़ंक्शन यह सुनिश्चित करता है कि लौटा बफर कम से कम एन के रूप में बड़ा हो अधिक स्मृति आवंटित करके।

चीयर्स, राजेश। एमवीपी, विजुअल ++।

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