هل أنا بحاجة إلى حذف هياكل تنظيم عبر Marshal.PtrToStructure في التعليمات البرمجية غير المدارة؟

StackOverflow https://stackoverflow.com/questions/497133

  •  20-08-2019
  •  | 
  •  

سؤال

ولدي هذا الرمز C ++:

extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
    *foo = new MY_DATA_STRUCTURE;

    //do stuff to foo
}

وبعد ذلك في C # I استدعاء الدالة على النحو التالي:

[DllImport("MyDll.dll")]
static extern void AllocateFoo(out IntPtr pMyDataStruct);

...

MyDataStructure GetMyDataStructure()
{
    IntPtr pData;
    ManagedAllocateFooDelegate(out pData);

    MyDataStructure foo = (MyDataStructure)Marshal.PtrToStructure(pData, typeof(MyDataStructure));
    return foo;
}

وأين MyDataStructure هو بنية (وليس من الدرجة) والتي تتطابق مع MY_DATA_STRUCTURE وتنظيمها أعضاء مناسب.

وهكذا الأسئلة: هل أنا بحاجة لتخزين pData ومن ثم الإفراج عنها مرة أخرى في التعليمات البرمجية غير المدارة عندما MyDataStructure هو GC'd؟ يقول MSDN لMarshal.PtrToStructure (IntPtr، النوع): "البيانات المشيرون من كتلة غير المدارة من الذاكرة إلى كائن مدار المخصصة حديثا من النوع المحدد." في هذه الجملة تعني عبارة "مارشال" يعني "نسخة"؟ في هذه الحالة كنت بحاجة إلى المحافظة (IntPtr pData) ومن ثم تمريرها إلى التعليمات البرمجية غير المدارة (في destructor MyDataStructure) حتى أتمكن من القيام C ++ "حذف"؟

ولقد بحثت لكنني لا استطيع تحديد إجابة واضحة بما فيه الكفاية لذلك.

هل كانت مفيدة؟

المحلول

وكما قال إريك، المشير لا يعني نسخة، لكنني لا اعتقد انه رد على النقطة الرئيسية لسؤالك.

هل انت بحاجة الى التمسك المؤشر الأصلي pData حتى MyDataStructure هو GCed؟ لا.

وبمجرد تنظيم مثيل MyDataStructure الخاص بك، فو، ويحتوي على نسخة من هيكل أشارت إليه pData. انك لا تحتاج الى التمسك pData أي لفترة أطول. لتجنب تسرب الذاكرة، يجب أن تجتاز أن pData إلى وظيفة غير المدارة أخرى من شأنها أن حذفها، والذي يمكن القيام به مباشرة بعد التعبئة، بغض النظر عن المدة التي الابقاء على سبيل المثال MyDataStructure.

نصائح أخرى

نعم، في هذه الحالة، يعني مارشال نسخة. وبالتالي، تحتاج إلى إلغاء تخصيص الذاكرة الخاصة بك في التعليمات البرمجية غير المدارة. كل دعوة إلى PtrToStructure لا تتم قراءة عدد البايتات التي أشار إليها حجم الهيكل الوجهة 'MyDataStructure "من موقع الذاكرة أشار إليه pData.

وتفاصيل بالطبع تعتمد على بالضبط ما MyDataStructure "يشبه (هل استخدام أي FieldOffset أو StructLayout سمات في MyDataStructure) - ولكن النتيجة النهائية هي أن العائد من PtrToStructure هو نسخة من البيانات

GBegen يشير في <لأ href = "https://stackoverflow.com/questions/497133/do -i-الحاجة إلى حذف هياكل-تنظيم-عبر-المشير-ptrtostructure في وغير المدارة / 497293 # 497293 "> جوابه ، لم أكن الإجابة على النقطة الرئيسية لسؤالك. نعم، سوف تحتاج إلى حذف النسخة غير المدارة من الهيكل الخاص في التعليمات البرمجية غير المدارة، ولكن لا، لا تحتاج إلى التمسك pData - يمكنك حذف نسخة غير المدارة في أقرب وقت الدعوة إلى PtrToStructure اكتمال

وPS: لقد تحرير منصبي لاحتواء هذه المعلومات وذلك لتعزيز الإجابات إلى وظيفة واحدة - إذا كان أي شخص upvotes هذه الإجابة، يرجى upvote الجواب GBegen، فضلا عن مساهمته

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top