ورود

View Full Version : سوال: تخریب اشیاء ؟



Modifier
سه شنبه 06 مهر 1389, 08:49 صبح
سلام
من داشتم یه نمونه کد در مورد الگوی Singleton مطالعه میکردم...
توی اون 2 نوع کد دیدم که برای تخریب اشیاء استفاده میشه...


procedure FreeGlobalObjects; far;
begin
if Global_CSingleton <> nil then
Global_CSingleton.Free;
if Global_OSingleton <> nil then
Global_OSingleton.Free;
end;


destructor TCSingleton.Destroy;
begin
if Global_CSingleton = Self then
Global_CSingleton := nil;
inherited Destroy;
end;
destructor TOSingleton.Destroy;
begin
if Global_OSingleton = Self then
Global_OSingleton := nil;
inherited Destroy;
end;


یک جا Object رو nil کرده...و جایی دیگر free...

سوالم اینه که چرا 2 جا ... ؟

در ضمن به کد زیر هم توجه کنید ...


begin
AddExitProc(FreeGlobalObjects);
end.

vcldeveloper
سه شنبه 06 مهر 1389, 11:26 صبح
این کد کجا بود؟ به نظر میاد خیلی قدیمی باشه، تعریف تابع به صورت far مربوط به Turbo Pascal هست! الان همچین چیزی منسوخ شده است.

در کد اول داره شی مربوطه رو که احتمالا به صورت Global هم تعریف شده، آزاد میکنه.

در کد دوم، در هنگام Free کردن اون شی، در داخل متد Destroy اش، داره اون متغیر Global رو nil میکنه، تا در هنگام Free کردن، اگر سایر بخش های برنامه به اون متغیر ارجاعی داشتند، اشتباها تصور نکنند که شی همچنان وجود داره. در اون صورت، اون بخش های برنامه دچار مشکل حافظه می شدند.


در ضمن به کد زیر هم توجه کنید ...
اون AddExitProc هم یک روتین قدیمی در SysUtils هست. SysUtils لیستی از توابع را نگهداری میکنه، و در پایان اجرای برنامه آنها را فراخوانی میکنه. این کد هم داره تابع FreeGlobalObjects را به این لیست اضافه میکنه تا این تابع در انتهای اجرای برنامه، فراخوانی بشه، و اشیاء مربوط به خودش را آزاد کنه.

در هر حال، الان پیاده سازی های بهتر و بروزتری از Singleton برای دلفی وجود دارند.