PDA

View Full Version : سوال در مورد آزاد سازی حافظه



Felony
سه شنبه 17 آذر 1388, 15:54 عصر
:لبخندساده:سلام ،

من تو برنامم لازم دارم یکسری اشیاء رو به صورت RinTime و به صورت نامحدود بسازم ، حالا میخوام بدونم این اشیا رو چه طور آزاد سازی کنم ؟ دلفی که خودش حافظه ی اختصاص یافته به اشیائی که ما به صورت RunTime ساختیم رو آزاد نمیکنه ؟ درسته ؟

من به عنوان نمونه کد زیر رو نوشتم :


var
Test:TImage;
begin
Test:=TImage.Create(FRM_Design);
Test.Parent:=FRM_Design;
Test.Transparent:=True;
IMGL_PCB.Draw(Test.Canvas,0,0,0,False);
Test.Top:=250;
Test.Left:=250;
Test.Height:=70;
Test.Width:=70;
Test.Show;
end;

الان با هر بار اجرای این کد یک شئ ساخته میشه اما من هیچ جای کد آزادش نکردم .
آیا باید در هنگام خروج از برنامه با یک حلقه کل کامپوننتها رو Free کرد ؟ ( فکر میکنم روش درستی نباشه )
آیا باید برای ساخت این اشیاء از آرایه ای از اشیاء استفاده کنم و در هنگام حروج اشیاء آرایه رو با یک حلقه Free کنم ؟

در آخر تفاوت Free با FreeOnRelease چیه ؟

:چشمک:ممنون .

Felony
سه شنبه 17 آذر 1388, 19:49 عصر
من در رویداد OnClose فرم برنامم کد زیر رو نوشتم :


var
i:Integer;
begin
// Free all object on exit
for i:=FRM_Design.ComponentCount-1 downto 0 do
Components[i].Free;

آیا راه بهتری هم هست ؟ و هنوز فرق بین Free و FreeOnRelease چیست ؟

vcldeveloper
چهارشنبه 18 آذر 1388, 07:02 صبح
آیا باید در هنگام خروج از برنامه با یک حلقه کل کامپوننتها رو Free کرد ؟ ( فکر میکنم روش درستی نباشه )
برای اون کدی که نوشتید، نیازی به این کارها ندارید؛ تا زمانی که Owner یک شی را مشخص می کنید (در مثال شما FRM_Design)، اون Owner خودش مسئول Free کردن آن شی هست، و لازم نیست شما کاری برای Free کردن شی انجام بدید.

اگر شی قابلیت داشتن Owner را نداره، اون وقت می تونید اشاره گر مربوط به شی را در یک TList یا TObjectList ذخیره کنید، و در پایان کار خودتان اشیاء ساخته شده را از لیست آزاد کنید، یا خصوصیت OwnsObjects لیست را از ابتدا True کنید، و در پایان کار لیست را آزاد کنید، تا خودش بطور خودکار اشیاء موجود در لیست را آزاد کند.

راه سوم هم این هست که اشیاء شما یک Interface با قابلیت Reference-count را پیاده سازی کنند، و شما در کد از آن Interface استفاده کنید، به این ترتیب، هر جا که دیگه نیازی به اون شی نباشه، شی بطور خودکار آزاد میشه، مثل کاری که دلفی با stringها انجام میده. البته این روش مستلزم آشنایی با Interfaceها در دلفی هست، وگرنه ممکنه بجای حل مشکل، چند مشکل جدید هم به مشکلات قبلی اضافه بشه!

Felony
چهارشنبه 18 آذر 1388, 07:24 صبح
اگر مالک شئ nil باشه چون به جایی اشاره نمیکنه باید خودمون آزادش کنیم درسته ؟
و فرق بین Free و FreeOnRelease چیست ؟

vcldeveloper
پنج شنبه 19 آذر 1388, 00:45 صبح
اگر مالک شئ nil باشه چون به جایی اشاره نمیکنه باید خودمون آزادش کنیم درسته ؟
بله.


و فرق بین Free و FreeOnRelease چیست ؟
FreeOnRelease متدی هست که در کامپوننت هایی که از اشیاء COM ساخته میشند کاربرد داره و Interface مربوط به COM را آزاد میکنه. این متد برای استفاده داخلی دلفی هست، و نیازی نیست شما مستقیما از آن استفاده کنید.

alinikaein
پنج شنبه 19 آذر 1388, 01:07 صبح
با اوصافي كه گفتيد، كدوم يكي از دو كد زير بهتره و تفاوتي هم داره يا نه؟

MyObject.Free;
MyObject := nil;

يا

FreeAndNil(MyObject);

Felony
پنج شنبه 19 آذر 1388, 07:10 صبح
MyObject := nil;
این کد اشاره گر مربوط به شئ رو در حافظه پاک میکنه و شئ آزاد نمیشه و چون اشاره گر مربوط به آدرس این شئ رو از بین بردید دیگه نمیتونید آزاداش کنید ، ولی هنوز تو حافظه هست و در برنامه هم کار میکنه .


MyObject.Free;
متد Free هم اول چک میکنه شئ nil نباشه و بعد خودش متد Destroy رو صدا میزنه .

alinikaein
پنج شنبه 19 آذر 1388, 07:26 صبح
MyObject := nil;این کد اشاره گر مربوط به شئ رو در حافظه پاک میکنه و شئ آزاد نمیشه و چون اشاره گر مربوط به آدرس این شئ رو از بین بردید دیگه نمیتونید آزاداش کنید ، ولی هنوز تو حافظه هست و در برنامه هم کار میکنه .


MyObject.Free;متد Free هم اول چک میکنه شئ nil نباشه و بعد خودش متد Destroy رو صدا میزنه .

منظور من استفاده از اين دو كد با هم و يا استفاده از FreeAndNil بود.

vcldeveloper
پنج شنبه 19 آذر 1388, 08:40 صبح
با اوصافي كه گفتيد، كدوم يكي از دو كد زير بهتره و تفاوتي هم داره يا نه؟

هر دو یک کار انجام میدند، البته FreeAndNil برخلاف اسمش ابتدا nil میکنه، بعد Free میکنه.