2010-04-20 17 views
7

ढेर पर wchar_t * के माध्यम से SysAllocString के साथ एक नया BSTR आवंटित करते समय, क्या मुझे ढेर पर मूल wchar_t * मुक्त करना चाहिए?क्या मैं SysAllocString को पारित स्मृति मुक्त कर सकता हूं?

तो क्या यह सही तरीका है?

wchar_t *hs = new wchar_t[20]; 
// load some wchar's into hs... 
BSTR bs = SysAllocString(hs); 
delete[] hs; 

क्या मुझे स्मृति को खाली करने के लिए यहां हटाना है? या वह स्मृति बस बीएसटी द्वारा अपनाई गई थी?

+0

हास्यास्पद का प्रकार - मैं पूरी तरह से चर पढ़ने में भूलना जब मैं अपने जवाब (जो मैं बाद में नष्ट कर दिया) तैनात। मैंने "देखा" हटाएं [] बीएस; एचएस के बजाय। मुझे नए चश्मे की आवश्यकता होगी। –

उत्तर

9

जैसा कि इसके नाम से तात्पर्य है, SysAllocString इसकी याददाश्त आवंटित करता है, यह इसकी तर्क की स्मृति को "अपनाने" नहीं देता है। BSTRs आकार-पूर्वनिर्धारित और शून्य-समाप्त हो गए हैं, इसलिए एक सी-शैली स्ट्रिंग को "अपनाना" असंभव है, क्योंकि आकार उपसर्ग के लिए कोई स्थान नहीं है।

3

हाँ, delete स्मृति।

10

SysAllocString(), documentation से, इस तरह बर्ताव करता है:

यह समारोह एक नया स्ट्रिंग और प्रतियां इसे में स्ट्रिंग पारित आवंटित करता है।

तो, हाँ, एक बार जब आप SysAllocString कहलाते हैं तो आप अपने मूल चरित्र सरणी को मुक्त कर सकते हैं, क्योंकि डेटा को नए आवंटित BSTR में कॉपी किया गया है।

new[] के साथ आवंटित new[] की स्ट्रिंग को मुक्त करने का उचित तरीका delete[] का उपयोग करना है।

wchar_t *hs = new wchar_t[20]; 
... 
delete[] hs; 

एक BSTR मुक्त करने के लिए उचित तरीके से SysFreeString() साथ है:

BSTR bs = SysAllocString(hs); 
... 
SysFreeString(bs); 

जब आप BSTRs के लिए नए हैं, तो आप Eric's Complete Guide to BSTR Semantics पढ़ना चाहिए।

3

The docs for SysAllocString() बहुत स्पष्ट हैं:

यह समारोह एक नया स्ट्रिंग और प्रतियां इसे में स्ट्रिंग पारित आवंटित करता है।

आप में पारित स्ट्रिंग डेटा कॉपी किया जाता है - SysAllocString() इसका इस्तेमाल नहीं है कि यह काम पूरा होने के बाद - आप पुनःआवंटन या कि बफर को संशोधित करने के लिए स्वतंत्र हैं।

0

परिवर्तित करने के लिए wchar_t*OLECHAR* करने के लिए आप W2OLE मैक्रो का उपयोग करने की आवश्यकता है:

wchar_t *hs = new wchar_t[20]; 
USES_CONVERSION; 
BSTR bs = SysAllocString(W2OLE(hs)); 
delete[] hs; // no need in hs anymore since SysAllocString allocates memory 
... 

SysFreeString(bs); // delete Sys string 
संबंधित मुद्दे