ورود

View Full Version : سوال: فرق این دو چیه.



Mask
یک شنبه 29 خرداد 1390, 17:38 عصر
با سلام.
فرق

FreeAndNil(Stream)
با

Stream.Free
چیه؟

ژوپیتر
یک شنبه 29 خرداد 1390, 18:18 عصر
در اولی همه مقادیر در حافظه برابر با NULL شده و اگه آدرس Stream رو در دیباگ ببینید برابر صفر است، در دومی هم این اتفاق میفتد ولی آدرس Stream لزوما برابر صفر نمیشود و آدرس نا معتبریست.
در اولی هر چند بار که استفاده بشه فرقی نداره مشکلی ایجاد نمیشه چون خود تابع اتومات NULL رو رد میکنه ولی در دومی بعد از Free شدن دیگه نمیشه دوباره اون رو کال کرد.

Felony
یک شنبه 29 خرداد 1390, 19:05 عصر
کد زیر رو اجرا کنید :

var
bm: TBitmap;
begin
bm := TBitmap.Create;
try
// Do something here
finally
bm.Free;
end;
if Assigned(bm) then
ShowMessage('Assigned !')
else
ShowMessage('Not assigned');
end;

با اجرای کد پیغام "Assigned" نمایش پیدا میکنه ؛
با صدا زدن متد Free شئ مورد نظر در حافظه آزاد میشه ولی اشاره گر مربوط به اون شئ معتبر هست و هنوز به اون مکان از حافظه اشاره میکنه ، وقتی با تابع Assigned شئ رو بررسی میکنید تابع وجود شئ رو تائید میکنه چون اشاره گر شئ به مکان خاصی از حافظه اشاره میکنه در صورتی که اون مکان دیگه متعلق به اون شئ نیست و برای اون شئ قابل استفاده نیست .

تابع FreeAndNil قبل از اینکه شئ رو آزاد کنه اشاره گر مربوط به اون رو nil میکنه و بعد آزادش میکنه با این کار هم شئ آزاد شده هم اشاره گر مرتبط با اون دیگه معتبر نیست ، اگر در همون کد بالا به جای bm.Free از تابع FreeAndNil استفاده میکردیم پیغام "Not Assigned" به نمایش در میامد ، معادل همون FreeAndNil رو هم خودتون میتونید پیاده کنید ، بعد از اینکه شئ رو آزاد کردید به اون مقدار nil رو اختصاص بدید :

var
bm: TBitmap;
begin
bm := TBitmap.Create;
try
// Do something here
finally
bm.Free;
bm:= nil;
end;
if Assigned(bm) then
ShowMessage('Assigned !')
else
ShowMessage('Not assigned');
end;

در کل زمانی باید نگران استفاده از FreeAndNil به جای Free باشید که در هنگام کار با اشیاء وجود یک شئ براتون مهم باشه ( مثل همون نمونه کد بالا ) در غیر این صورت اگر بعد از آزاد کردن یک شئ اطمینان دارید که دیگه تو کدهای بعد از اون جایی به شئ ارجاعی ندارید نیازی به استفاده از FreeAndNil نیست .

Mask
یک شنبه 29 خرداد 1390, 19:31 عصر
میشه بیشتر در مورد اشاره ،اشاره گر توضیح بدید.
مفهوم اشاره گر یکم برام مبهمه.
اینو درک کردم که free مقدار شی رو خالی میکنه. اما منظور از اشاره گر رو درست متوجه نشدم.

Felony
یک شنبه 29 خرداد 1390, 20:09 عصر
اشاره گر ( Pointer ) نوعی متغییر هست که به خانه ای از حافظه اشاره میکنه ، اشاره گر ها در نوشتن برنامه هایی که نیاز به Performance بالا دارن ( مخصوصا زبان های Native ) جزء مهمترین مباحث هستند ؛ مبحث اشاره گرها چیزی نیست که در چند خط بشه توضیحش داد ، این پست فقط برای این هست که مفهوم کلی اشاره گر رو درک کنید .

اشاره گر ها به خانه ی خاصی از حافظه اشاره میکنن ، مثلا اشاره گر به یک رشته به آدرس یک رشته در حافظه اشاره میکنه که به وسیله ای آدرس شما میتونید به این رشته دسترسی پیدا کنید .

مثلا در همین دلفی اشیاء ، interface ها ، رشته ها و آرایه های دینامیک در پشت صحنه ( کامپایلر ) به صورت اشاره گر پیاده سازی شدن ، به همین دلیل هست که وقتی به وسیله تابع SizeOf سایز یک رشته یا آرایه دینامیک رو میگیرید هرچند که اون رشته یا آرایه حاوی اطلاعات زیادی باشه باز هم تابع SizeOf مقدار 4 رو بر میگردونه ، چون اشاره گرها در کامپایلر 32 بیت دلفی 4 بایت فضا از حافظه رو اشغال میکنن ؛ این گفته به این معنی هست که وقتی مثلا شما با یک رشته در دلفی کار میکنید در حقیقت دارید با یک اشاره گر کار میکنید که به یک خانه در حافظه اشاره میکنه .

در برخی از کارها سرعت کار با اشاره گرها در برابر کار با متغییرها نوعی معجزه هست ، به همین دلیل هم گفتم در برنامه هایی که میزان Performance اهمیت داره اشاره گرها بسیار مهم هستند .