मैं सी # में नया हूं और सी ++ डीएल के साथ सी # संवाद करने की कोशिश कर रहा हूं। मेरा मुख्य उद्देश्य Marshal.AllocHGlobal() का उपयोग करके सी # में मेमोरी आवंटित करना है, इसमें मान असाइन करें और IntPtr के संदर्भ को सी ++ डीएल में पास करें। सी ++ डीएल के पक्ष में, मैं आवंटित स्मृति आकार को malloc() के साथ बदल रहा हूं, चर असाइन करें। अंत में, मैं सी # में मान मुद्रित करता हूं। इस बिंदु तक, सब कुछ ठीक काम करता है।

लेकिन जब मैं Marshal.FreeHGlobal() के साथ सी # में आवंटित स्मृति को मुक्त करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है।

असल में, मैं बहुत कुछ खोजता हूं कि मुझे इन कार्यों के साथ अपना कोड कैसे कार्यान्वित करना चाहिए। मुझे एक समाधान मिला जो कहता है कि मुझे स्मृति को हटाने के लिए डीएलएल में एक फ़ंक्शन लिखना होगा और इस फ़ंक्शन को कॉल करना होगा। लेकिन मेरे मैनेजर ने मुझसे कहा, मुझे यह काम C# साइड में करने की जरूरत है। तो मैं उस समाधान का उपयोग नहीं कर सकता। साथ ही, मुझे कुछ अन्य विचार मिले जो COM का उपयोग करते हैं लेकिन प्रबंधक COM का उपयोग नहीं करना चाहता। तो मैं COM का उपयोग नहीं कर सकता। यहाँ कुछ कोड;

सी # में स्मृति आवंटित करना

var offset = 0;
var size = Marshal.SizeOf(typeof(dVehicle)) * denemeVehicle.Count();
IntPtr vehPnt;
vehPnt = Marshal.AllocHGlobal(size);

for(var i = 0; i < denemeVehicle.Count(); i++)
{
    Marshal.StructureToPtr(denemeVehicle[i], new IntPtr(vehPnt.ToInt64() + offset), false);
    offset += Marshal.SizeOf(typeof(dVehicle));
}

आवंटित स्मृति आकार को C++ में बदलना

*vehicles = (dVehicle*) malloc(sizeof(dVehicle) * (new_VehSize));

आवंटित स्मृति मुक्त करें

Marshal.FreeHGlobal(vehPnt); // The error shows up in here

और यह त्रुटि संदेश है;

हैंडल अमान्य है। (HRESULT से अपवाद: 0x80070006 (E_HANDLE))

0
Mad_Beggar 17 मई 2019, 09:51

1 उत्तर

सबसे बढ़िया उत्तर

Marshal.FreeHGlobal() C malloc() फ़ंक्शन के साथ आवंटित की गई मेमोरी को मुक्त नहीं कर सकता। मेमोरी "[मार्शल] AllocHGlobal, [Marshal.]ReAllocHGlobal, या किसी भी समान अप्रबंधित API विधि द्वारा आवंटित वैश्विक हीप से होनी चाहिए।"

आंतरिक रूप से, Marshal.AllocHGlobal() और Marshal.FreeHGlobal() Win32 LocalAlloc() और LocalFree() फ़ंक्शन का उपयोग करते हैं। यह MSDN पर प्रलेखित है।

अन्यथा, यदि आप चाहते हैं कि डीएलएल मेमोरी आवंटित करे, हालांकि वह चाहता है, तो आपको सी # कोड को आवंटित पॉइंटर को वापस डीएलएल में पास करना होगा ताकि इसे सही ढंग से मुक्त किया जा सके, यानी सी free() फ़ंक्शन का उपयोग कर यदि मेमोरी malloc() के साथ आवंटित की जाती है।

यदि दो मॉड्यूल एक दूसरे के साथ मेमोरी साझा करते हैं, लेकिन एक सामान्य मेमोरी मैनेजर (जैसे कि ओएस द्वारा प्रदान किया गया) पर सहमत नहीं हैं, तो मेमोरी आवंटित करने वाला मॉड्यूल इसे मुक्त करने के लिए एक ही मॉड्यूल होना चाहिए, क्योंकि यह एकमात्र मॉड्यूल है वह जानता है कि स्मृति को कैसे आवंटित किया गया था और इस प्रकार इसे कैसे मुक्त किया जाए।

3
Remy Lebeau 17 मई 2019, 07:16