سؤال

نحن نستخدم فئة تسمى ODNCServer هنا - عند التهيئة TAutoObjectFactory يتم إنشاء الكائن:

initialization
  pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);

الآن FastMM يشكو من تسرب الذاكرة لأنه لم يتم تحرير هذا الكائن في أي مكان.إذا قمت بإضافة بيان نهائي مثل هذا

finalization
  if assigned(pAutoObjectFactory) then
    TAutoObjectFactory(pAutoObjectFactory).Free;

ثم يتم تحرير الكائن، ولكن بعد ينبثق مربع حوار FastMM حول تسرب الذاكرة، لذلك يبدو أن نظام التشغيل يقوم بتفريغ ملف DLL، وليس البرنامج.حالات ODNCServer يتم إنشاؤها مثل هذا

fODNCServer := TODNCServer.Create(nil);
//register into ROT
OleCheck(
 RegisterActiveObject(
   fODNCServer.DefaultInterface,            // instance
   CLASS_ODNCServer,    // class ID
   ACTIVEOBJECT_STRONG,       //strong registration flag
   fODNCServerGlobalHandle //registration handle result
 ));

وتحرر هكذا:

if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
  Reserved := nil;
  OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
  fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);

لذا، هل يعرف أحد ما الذي يجب علي تغييره للتخلص من تسرب الذاكرة؟بالمناسبة، لقد حاولت أيضًا استخدام FastMM RegisterExpectedMemoryLeaks للتسجيل وتجاهل التسرب، ولكن يبدو أن هذا لا ينجح.بالإضافة إلى ذلك، حتى لو كان ذلك مجرد حل بديل وأود أن أعرف الطريقة الصحيحة للقيام بذلك.

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

المحلول

لا تقلق بشأن هذاإنه ليس "تسرب" بالمعنى الدقيق للكلمة.نعم، أنت تقوم بإنشاء كائن لم يتم تحريره مطلقًا، ولكن الكلمة الأساسية هي "an".صيغة المفرد.

لن يقوم التطبيق/DLL الخاص بك "بتسريب" الذاكرة، بمعنى أنه سينشئ مثيلات عديدة لهذه الكائنات، مما يزيد من استخدام الذاكرة باستمرار.علاوة على ذلك، سيتم تنظيف الذاكرة التي يستخدمها كائن المصنع الفردي (وأشياء أخرى مثله) عند انتهاء العملية على أي حال.

إذا أظهرت الرمز الذي تستخدمه للاتصال تسجيل المتوقعMemoryLeak () قد يكون من الممكن تحديد سبب عدم نجاح حالتك المحددة.

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