PDA

View Full Version : آزاد سازی حافظه



1485159
دوشنبه 27 اردیبهشت 1389, 22:10 عصر
سلام
فرض کنید من یه تابع نوشتم که خروجیش TStrings باشه. بنابراین باید اول بنویسم:

Result:= TStringList.Create;خوب حالا وقتی که کار تابع تموم شد چطوری باید اینو از بین ببرم؟ در حالی که تابع باید خروجی داشته باشه!

tdkhakpur
دوشنبه 27 اردیبهشت 1389, 23:08 عصر
تا وقتی که استفاده میشود شما نمیتوانید آزاد کنید.
اگر آزاد کنید result شما معنی نخواهد داشت.

1485159
دوشنبه 27 اردیبهشت 1389, 23:25 عصر
منم سوالم اینه دیگه!
بعد از اینه که از تابع خارج شدم چطوری آزادش کنم؟

Mahmood_M
سه شنبه 28 اردیبهشت 1389, 02:20 صبح
منم سوالم اینه دیگه!
بعد از اینه که از تابع خارج شدم چطوری آزادش کنم؟
برای توابعی که مقدار برگشتیشون یک شیء ( Object ) مثلا TStringList هست باید یک متغیر با نوع همون مقدار برگشتی تعریف کنید و اون رو برابر با مقدار برگشتی تابع قرار بدید ، بعد می تونید از مقادیر اون استفاده کنید ، در پایان هم وقتی اون رو Free میکنید شیء ای که بهش نسبت دادید ( همون شیء ای که در تابع ساخته شده ) هم آزاد خواهد شد ...
به عنوان مثال ، تابع زیر رو در نظر بگیرید :
function MakeList : TStringList;
var
I : Integer;
begin
Result := TStringList.Create;
for I := 0 to 9 do
Result.Add(IntToStr(I));
end;
تابع بالا یک شیء TStringList برگشت میده ، به صورت زیر باید از مقدار برگشتی استفاده کنید :
var
MyList : TStringList;
begin
MyList := MakeList;
try
...
finally
MyList.Free;
end;
end;
به کد بالا دقت کنید ، شیء MyList در ابتدای کد به عنوان یک TStringList ساخته ( Create ) نشد بلکه مستقیما برابر با TStringList ساخته شده در تابع قرار گرفت ، اگر قبل از اختصاص مقدار تابع به MyList ، اون رو Create کنید ، مثلا به صورت زیر :
var
MyList : TStringList;
begin
MyList := TStringList.Create;
MyList := MakeList;
try
...
finally
MyList.Free;
end;
end;

درواقع دو شیء TStringList ساخته شده ( یکی در تابع و یکی هم MyList ) ولی در پایان یک از اونها ( فقط MyList ) آزاد خواهد شد ، پس اگر می خواید که شیء ساخته شده در تابع آزاد بشه باید اون رو مستقیما به متغیرتون نسبت بدید ...

نکته ی آخر اینکه سعی کنید در آخر کار و در قسمت Finally از اختصاص فضا به MyList اطمینان حاصل کنید و بعد آزادش کنید ، ممکنه در هنگام اجرای تابع مشکلی پیش بیاد و شیء ساخته نشه یا به متغیرتون اختصاص داده نشه ، مثلا به صورت زیر عمل کنید :
var
MyList : TStringList;
begin
MyList := MakeList;
try
...
finally
if Assigned(MyList) then
MyList.Free;
end;
end;
موفق باشید ...