PDA

View Full Version : عدم Destroy کردن Object ها



rayangostar_co
چهارشنبه 13 دی 1391, 09:53 صبح
با سلام خدمت دوستان برنامه نویس

چرا بعد از خروج یه procedure مقادیر آبجکت های تعریف شده از بین نمی روند؟؟؟؟؟؟؟

یعنی تو یه فرمی پروسجر زیر تعریف شده است و datagrid موجود در فرم پر می شود. ولی وقتی که فرم بسته می شود و دوباره باز می شود datagrid همان مقادیر را دارد و از بین نمی رود!!


procedure ............
var
ds: tdatasource;
listField: TStringList;
objSqlManager: TSqlManager;
begin
listField := TStringList.Create;
listField.Add('....');
listField.Add('......');
objSqlManager := TSqlManager.Create;
objSqlManager.connect(cnnString);
ds := objSqlManager.select(..............);
grid.DataSource := ds;
end;

Felony
چهارشنبه 13 دی 1391, 10:03 صبح
اون اشیاء رو به صورت دستی ساختید ، مگه جایی اون ها رو آزاد کردید که توقع آزاد شدنشون رو دارید ؟

rayangostar_co
چهارشنبه 13 دی 1391, 10:15 صبح
استاد عزیز جناب آقای Mahan-1363- من دلفی رو تازه شروع کردم و قبلا با C#‎ کار می کردم. بنابر این تجربه ای تو برنامه نویسی دلفی ندارم.
ولی از اونجایی که تو بیس همه زبان های برنامه نویسی وقتی که تابعی تعریف میشه و متغیر هایی داخلش ایجاد میشه . با تمام شدن اجرای اون تابع همه آبجکت ها و متغیر هاش از حافظه خارج میشن.

چرا دلفی این کارو نمی کنه؟؟

Felony
چهارشنبه 13 دی 1391, 11:04 صبح
#C ، من بهش میگم باهوش و احمق ، بماند ... !


ولی از اونجایی که تو بیس همه زبان های برنامه نویسی وقتی که تابعی تعریف میشه و متغیر هایی داخلش ایجاد میشه . با تمام شدن اجرای اون تابع همه آبجکت ها و متغیر هاش از حافظه خارج میشن.
درسته متغییر ها دارای Scope هستن ولی این Scope به تنهایی نیست که Life Time یک متغییر یا شئ رو تعیین میکنه بلکه علاوه بر اون Memory Area ی که اون متغییر درش قرار داره هم در امر آزاد سازی دخیله ، کلا در برنامه های ویندوزی 3 نوع حافظه داریم :

1- Global Memory : که برای مقادیر Global استفاده میشه و در هنگام اجرای برنامه اختصاص داده میشه و در هنگام بسته شدن برنامه هم آزاد میشه که بهش Data Segment میگن و نیازی به نگرانی برای آزاد سازی متعلقات این بخش نداریم چون همونطور که گفته شد به صورت خودکار در هنگام اجرا و بسته شدن برنامه به ترتیب بهشون حافظه اختصاص داده میشه و آزاد میشن .

2- Stack : وقتی یک متغییر در یک Function یا Procedure تعریف میکنید حافظه مورد نیاز به اون در Stack رزرو میشه ، حافظه استک به صورت LIFO کنترل میشه ، در برنامه های نوشته شده توسط Delphi استک برای موارد زیر استفاده میشه :


متغییرهای Function ها ، Procedure ها و به طور کلی متدها .
پارامترها و نوع برگشتی Function ها .
استفاده از توابع API
رکوردها ( دلیل اینکه از رکوردها هم نمونه سازی نمیکنیم همینه )


پس نیازی به نگرانی برای متعلقات stack هم نیست چون به صورت خودکار مدیریت میشن .

3- Heap : قسمتی از حافظه اختصاصی از برنامه هست که به صورت داینامیک عمل میکنه ، یعنی سایز خاصی نداره و هر لحظه ممکنه فضای جدیدی نیاز داشته باشه ، ساختار فضای heap ساختار مشخص و منظمی نیست و حافظه اختصاصی به اون به صورت Random انتخاب میشه و دلیلی نداره وقتی شیئی در Heap مثلا در آدرس 10 ساخته شد شئ بعدی حتما در آدرس 11 ساخته بشه ، ممکنه شئ جدید در آدرس 1372 ساخته شه و به همین دلیل هم سرعت heap در مقایسه با stack کمتر هست .

وقتی نمونه ای از یک کلاس ساخته میشه در heap این فضا به اون اختصاص داده میشه ، به طور کلی در Delphi برای موارد زیر از heap استفاده میشه :


ساخت یک نمونه از یک کلاس .
تعریف و تغییر سایز آرایه های داینامیک .
اختصاص حافظه به وسیله ی GetMem, FreeMem, New ,Dispose
نوع های داده ای مثل Ansi , Wide, Unicode و Variant ها و Interface ها که البته این موارد آخر همگی توسط Delphi مدیریت میشن .


خوب همونطور که معلوم شد ، متعلقات heap به جز اون مورد آخر توسط دلفی کنترل نمیشن و وظیفه مدیریت حافظشون با شماست .

در #C شما Garbage Collection رو در اختیار دارید که میافته دنبال شما و اشیایی که ازشون استفاده نمیشه ( Reference Count = 0 ) رو آزاد میکنه ولی اینجا شما مسئول این کار هستید .

در مورد مدیریت حافظه مطالب زیادی در همین بخش هست که با جستجو پیداشون میکنید .

موفق باشید .