PDA

View Full Version : سوال: تفاوت Free با Destory



hadisalahi2
یک شنبه 15 تیر 1393, 12:20 عصر
بچه ها تفاوت متد Destroy با Free در چیه؟
من برای آزاد کردم بعضی مواقع از این و بعضی مواقع از اون استفاده میکنم
ولی اصولا تفاوتش رو نمیدونم.

کسی هست بگه تفاوتش چیه عایا و کدامین یک بهتر است؟

یوسف زالی
دوشنبه 16 تیر 1393, 00:26 صبح
کنترل کلیک کن روش برادر.

hadisalahi2
دوشنبه 16 تیر 1393, 09:38 صبح
این free


procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;


این Destory

destructor TObject.Destroy;begin
end;

کلا یعنی همین قدر فرق دارند؟
پس از کدوم استفاده کنیم و چرا استفاده کنیم؟

BORHAN TEC
دوشنبه 16 تیر 1393, 10:55 صبح
با سلام،
کاملاً واضحه که بهتره که از Free به جای Destroy استفاده کنیم. در جاهایی که یک متغیر از یک کلاس رو به صورت عمومی تعریف می کنیم، مقدار اولیه nil به اون نسبت داده میشه و اگه اون رو create نکنیم و اون رو Free کنیم خطایی رخ نمیده ولی اگه به جای free از destroy استفاده کنیم با یک خطای AV مواجه میشیم.
مثال:
// ....type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
var
sl: TStringList;
end;


var
Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
sl.Destroy; // AV Error :(
end;


// ...

// ...

procedure TForm1.FormCreate(Sender: TObject);
begin
sl.Free; // Without Error :)
end;


// ...
توجه داشته باشید که تنها تفاوت همینه. حالا اگه sl به صورت محلی تر تعریف شده باشه(یعنی در داخل یک تابع یا رویداد) چون مقدار اولیه nil نیست در هر دو صورت، چه از Free استفاده کنیم و چه از Destroy با خطای AV مواجه می شویم. در حالت کلی بهتره که به جای این دو از FreeAndNil استفاده بشه:
// ...

procedure TForm1.FormCreate(Sender: TObject);
begin
FreeAndNil(sl);
end;


// ...
موفق باشید...

hadisalahi2
دوشنبه 16 تیر 1393, 12:28 عصر
در حالت کلی بهتره که به جای این دو از FreeAndNil استفاده بشه
این تابع در هر حالت خطایی دیگه تولید نمیکنه؟

یوسف زالی
دوشنبه 16 تیر 1393, 12:54 عصر
هادی چرا کنترل کلیک نمی کنی؟
کدش رو ببین اصلا سخت نیست.



کاملاً واضحه که بهتره که از Free به جای Destroy استفاده کنیم.

این حرف همه جا درست نیست.
اما در برنامه حالت عادی می تونه درست باشه.

BORHAN TEC
دوشنبه 16 تیر 1393, 13:07 عصر
این تابع در هر حالت خطایی دیگه تولید نمیکنه؟

خطا تولید میکنه مثل Free و Destroy(مثلاً متغیری از یک کلاس که توی تابع تعریف شده ولی Create نشده)، ولی مزیت استفاده از FreeAndNil در اینه که با تابع Assigned سازگاره و کنترل بهتری رو برای ما به ارمغان میاره. برای اینکه این مورد رو درک کنید به مثال زیر توجه کنید.

کد شماره 1:
procedure TForm1.FormCreate(Sender: TObject);var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Add('Hello');
sl.Add('World');
sl.Free;


if Assigned(sl) then
ShowMessage(sl.Text)
else
ShowMessage('از حافظه آزادسازی شده!');
end;
نتیجه اجرای کد بالا نمایش یک پیام خالی است و میبینید که در اینجا تابع Assigned بی فایده است و فقط نقش هویج رو بازی میکنه!
و اما در کد زیر همه چیز خوب پیش میره و میبینید که Assigned بک فایده هایی داره و خطای منطقی رو از بین میبره:
procedure TForm1.FormCreate(Sender: TObject);var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Add('Hello');
sl.Add('World');
FreeAndNil(sl);


if Assigned(sl) then
ShowMessage(sl.Text)
else
ShowMessage('از حافظه آزادسازی شده!');
end;
در کل همانطور که میدونید متدها و توابع آزادسازی حافظه در برنامه های واقعی به شکل زیادی با تابع Assigned گره می خورند و برای اینکه همه چیز خوب پیش بره بهتره که از FreeAndNil استفاده کنیم. :چشمک:


این حرف همه جا درست نیست.

متوجه نمیشم. مثلاً کجاها؟ میشه بیشتر توضیح بدی؟ :متفکر:

یوسف زالی
دوشنبه 16 تیر 1393, 13:17 عصر
گاهی لازمه برنامه مموری لیک یا نادرستی ترتیب گرفتن . آزاد کردن حافظه رو کنترل یا اعلام کنه. مثلا در کامپوننت ها، همین یک کنترل می تونه شما رو از کندی در بیاره. فرم ها هم همین طور، ممکنه گاهی شمارنده هایی قرار بدیم برای یک سری کارهای خاص روی اشیا. فری کردن اونها این تنبلی رو به بار میاره که برنامه نویس دقیق نمی شینه روال رو کنترل کنه چون ارور نمی گیره و به نظرش همه چی اوکیه. بعد تو تعداد اشیا دچار مشکل می شه. به شخصه به برنامه نویسان شرکتمون اجازه نمی دم از Free استفاده کنند.

hadisalahi2
دوشنبه 16 تیر 1393, 18:08 عصر
هادی چرا کنترل کلیک نمی کنی؟
کدش رو ببین اصلا سخت نیست.


داداش کدش رو دیدم و چون از مزیت و معایبش سر در نیاوردم ، سوال کردم از اساتید. :گیج:



. به شخصه به برنامه نویسان شرکتمون اجازه نمی دم از Free استفاده کنند.
به نظر شما در چه مواردی استفاده از Free بهتره و در چه مواردی Destory?

یوسف زالی
دوشنبه 16 تیر 1393, 20:04 عصر
از نظر من تنها در موارد خاص که امکان تریس دقیق، یا آگاهی از نتیجه یک تابع که شی برمی گردونه وجود نداره، یا کدی که با try هندل شده.
این فقط نظر منه البته.

soft-c
سه شنبه 17 تیر 1393, 07:06 صبح
شما وقتی یک متغیر تعریف می کنید در اصل یک شی ساختید با اشاره به قسمتی از حافظه . خوب وقتی شما با اون کاری نداشته باشید و بخواهید که حافظه را از اون بگیرید دو تا کار می تونید انجام بدید:
1- فقط اشاره گر اون را از بین ببرید . یعنی شی شما به جایی اشاره نکنه که در این صورت خود شی همچنان در حافظه باقی می مونه و میتونه در ادامه مشکل هایی را بوجود بیاره .
2- می تونید هم شی و هم اشاره گر اون را پاک کنید که خوب این روش بهتره . چون دیگه اثری از اون باقی نمی گذاره .
البته از روش اول هم می تونید وقتی استفاده کنید که بخواهید از شی در ادامه برنامه استفاده کنید که خوب باید حواستون باشه که اگر یادتون رفت و از اون استفاده نکردید ، اون شی مثل زباله های فضایی :متفکر: در حافظه می مونه .

hadisalahi2
سه شنبه 17 تیر 1393, 09:43 صبح
از نظر من تنها در موارد خاص که امکان تریس دقیق، یا آگاهی از نتیجه یک تابع که شی برمی گردونه وجود نداره، یا کدی که با try هندل شده.
این فقط نظر منه البته.

الان این مورد برای Free بود دیگه درسته؟

پس با توجه به نظر شاهین ، اگه خواستیم Free بزنیم ، بهتره FreeAndNil رو بزنیم دیگه؟

یوسف زالی
سه شنبه 17 تیر 1393, 10:40 صبح
خوب وقتی شما با اون کاری نداشته باشید و بخواهید که حافظه را از اون بگیرید دو تا کار می تونید انجام بدید:

بحثی که می شه ارتباطی با این صحبت نداره دوست من.




پس با توجه به نظر شاهین

از شاهین بپرس خب!

به نظر من Destroy منطقی تره. شاید در کارکرد دیگران Free یا چیز دیگه بهتر باشه.
نظر من در رابطه با Try هم همینه، فقط در مواقعی که خارج از دست ماست، مثل کار با فایل..