Managing unmanaged string across C++ / C# boundary with P/Invoke -


मेरे पास निम्न स्ट्रक्चर घोषित (सी ++) हैं:

  struct नेटिवऑपरेशन रिज़ल्ट {const INTEROP_BOOL सफलता ; // INTEROP_BOOL = char const char16_t * const त्रुटि संदेश; निवासीऑपरेशन रिजल्ट (कॉन्स्ट नेटिवऑपरेशन रिजल्ट & amp; c); / * विभिन्न कन्स्ट्रक्टर, संक्षेप के लिए छोड़े गए;   

अब, मेरे पास एक निर्यातित फ़ंक्शन परिभाषा कहीं भी है:

  extern "c" __declspec (dllexport) नेटिवऑपरेशन रिजल्ट वापसी फेलरव्यूथ मेसेज () {रिटर्न {INTEROP_BOOL_FALSE, "टेस्ट "}; }   

मेरी उम्मीद है कि फोन को कॉल करना है ReturnFailureWithMessage (अगर आप सोच रहे थे तो एक परीक्षण विधि) सी # से पी / इंवोक द्वारा। नेटिवऑपरेशन रिजल्ट कन्स्ट्रक्टर में, यह "टेस्ट" की एक प्रति लेता है और इसे ErrorMessage में डालता है।

नेटिवऑपरेशन रीजल्ट का char16_t का स्वामित्व है * इसलिए मुझे इसे हटाने की आवश्यकता है जब संरचना नष्ट हो जाती है। यह कोई समस्या नहीं है, लेकिन मैं मेमोरी को हटाना नहीं चाहता इससे पहले कि नेट सीएलआर को स्ट्रिंग को कॉपी करने का एक मौका है।

सच कहूँ तो मैं कहां से हटाना चाहता हूं उस मेमोरी मुझे क्या लगता है कि सी ++ कंपाइलर मेरी संरचना की एक प्रतिलिपि बना देगा (या इसे स्थानांतरित करें) और फिर सीएलआर उस प्रति का उपयोग करेगा ... इसका अर्थ है कि मैं नेटिक मेमोरी को मार्शल.फ्रीएचजीब्लबल

क्या यह सही है?

नहीं, जो सही नहीं है। आपको दो मामलों के बीच अंतर करने की आवश्यकता है:

1) आपने C ++ पक्ष पर कोई आवंटन नहीं किया है। यह वह मामला है जिसके बारे में आप अभी बात कर रहे हैं

2) आपने सी + + पक्ष पर आवंटन किया है, आपको डेलोकेशन की देखभाल करने की आवश्यकता है।

इस प्रकार आपके प्रश्न का उत्तर देने के लिए: नहीं, आपके उदाहरण को स्मृति के किसी भी "विलोपन" की आवश्यकता नहीं है, क्योंकि कोई भी स्मृति को स्पष्ट रूप से आवंटित नहीं करता है।

दूसरा मामला थोड़ा पेचीदा है यदि आप C ++ पक्ष पर new char16_t [blah] के साथ मेमोरी आवंटन करते हैं, तो आपको स्मृति को हटाएं [] मूलऑपरेशन रिजल्ट। त्रुटि संदेश से रिलीज करना होगा। सी # पक्ष पर ऐसा करना संभव नहीं है स्मृति को अलग आबंटक (जैसे; malloc , नया ) का उपयोग करके आवंटित किया जा सकता है और सी # इन बिंदुओं से निपटने के लिए नहीं जानता है।

आप नेटिवऑपरेशन रिजल्ट में एक नया फ्लैग जोड़ने की आवश्यकता है, जैसे डिलिशनरूपी , और अप्रबंधित पक्ष से नया फ़ंक्शन निर्यात करें: नि: शुल्कऑनलाइनऑपरेशन रिजल्ट इनिनेट (..) । ।

आप C ++ स्ट्रिंग्स के साथ ये सभी अज्ञानता से बच सकते हैं। वे जादुई काम करते हैं, और कोई विलोपन आवश्यक नहीं है। <पूर्व> struct नेटिवऑपरेशन रिज़ल्ट {const INTEROP_BOOL सफलता; // INTEROP_BOOL = चार कॉन्स्ट स्ट्रिंग स्ट्रंक त्रुटि संदेश; निवासीऑपरेशन रिजल्ट (कॉन्स्ट नेटिवऑपरेशन रिजल्ट & amp; c); / * विभिन्न कन्स्ट्रक्टर, संक्षेप के लिए छोड़े गए;

Comments

Popular posts from this blog

java - ImportError: No module named py4j.java_gateway -

python - Receiving "KeyError" after decoding json result from url -

.net - Creating a new Queue Manager and Queue in Websphere MQ (using C#) -