سؤال

ولدي بعض التعليمات البرمجية في C # التي لديها المجمع كوم. ويستخدم هذا المجمع كوم في تطبيق ج ++ الأصلي. يستخدم رمز ج ++ الأسلوب الذي بإرجاع مجموعة من الحالات من فئة من ج # مكتبة. الحالات تأتي من SAFEARRAY مثل ذلك:

for (long i =min; i<=max;i++)
    {   
        IMyInterface *l = (IMyInterface *)malloc(sizeof IMyInterface );

        SafeArrayGetElement(array,&i, &l);
    <other code>

    }

وأريد لتحرير الذاكرة المخصصة لمثيل ل، ولكن إذا أدعو

free(l)

وثم أحصل على الحادث.

ولقد حاولت

VariantClear ((VARIANT*)l);

ووباستخدام

SafeArrayDestroy(array)

ولكن ما زلت تسريب 4 بايت لكل مثيل في مجموعة.

وأي أفكار كيف ينبغي أن تذهب نحو تحرير هذه الذاكرة؟

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

المحلول

وهذا الرمز يبدو مشوشة قليلا: كنت مارة "sizeof IMyInterface" لmalloc ()، والتي سوف يكون حجم في الذاكرة مثيل IMyInterface، لا مؤشر إلى أنه: قد يعني أيضا "sizeof IMyInterface * "إذا كنت ترغب في تخصيص الذاكرة لمؤشر.

ولكن، والنظر في ذلك، وهذا لا يجعل أي معنى إما: لن تكون أفضل حالا لا تفعل malloc () في كل شيء؟ الوسيطة الأخيرة إلى SafeArrayGetElement () هو مؤشر إلى الذاكرة التي ستعقد النتيجة، لذلك () المؤشر الذي تم إرجاعه من قبل malloc () سوف يكون مجرد الكتابة محتويات ل (وهذا هو السبب مجانا () يعطيك العطل). وبعبارة أخرى، فقط هذا يجب أن تعمل:

IMyInterface *l;
SafeArrayGetElement(array,&i, &l);

ودون أن يعرفوا بالضبط ما هو في مجموعة، فإنه ليس من السهل أن تكون على يقين، ولكن يبدو أنك كنت الحصول على الخلط من جانب قضية قديمة C / C ++ من الفرق بين المؤشرات والكائنات يشيرون إليها.

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