PDA

نسخه کامل مشاهده نسخه کامل : garbage collection در دلفي و پاسكال؟



oranoos_92
13-12-2008, 15:51
سلام خدمت عزيزان
دوستان من دارم بر روي
garbage collection
در دلفيو پاسكال تحقيق ميكنم در پاسكال كه نيست و لي گويا در دلفي اين متد هست كسي از دوستان يه مقاله يا توشيح در حد يك صفحه فارسي ميتونه براي اين مورد لطف كنه و واسه من بزاره
تشكر

F A R H A D
13-12-2008, 16:52
سلام
تکنیکی هست که منابعی از سیستم که در اختیار اشیایی قرار داره که به جایی ارجاع ندارند و برنامه نویس فراموش کرده اونها رو از بین ببره رو آزاد میکنه و به سیستم برمیگردونه
البته در اینکه در دلفی به صورت خودکار وجود داره یا خیر مطمئن نیستم، به codegear.com سری بزنید جواب میگیرید
موفق باشید

oranoos_92
13-12-2008, 21:08
ممنون از شما من هم دنبال اين هستم كه ببينم دلفي آيا استفاده ميكنه يا نه
تشكر

F A R H A D
13-12-2008, 21:25
بفرمایید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

VDeveloper
14-12-2008, 01:26
در دلفی Garbage Collector وجود نداره، و برنامه نویس باید خودش تمامی منابعی که ساخته را آزاد کنه، تنها استثناء در نوع داده string و Dynamic Array و Interfaceها هست؛ این داده ها Reference-counted هستند و بطور خودکار توسط مدیرحافظه دلفی آزاد میشند.

_H2_
14-12-2008, 07:35
سلام
در واقع این قابلیت از جمله امکانات ذاتی محیط CLR مایکروسافت است و به برنامه های تحت Microsoft Framework.Net ارائه میشود.

مثلاً میتوان در یک حلقه for هزار نمونه از شی ای ایجاد کرد، بدون هیچ آزاد سازی ای.
new classname).methodname)
(دستوری شبیه این در یک حلقه میتواند یک فاجعه RAM ای در ++VC یا VB6 باشد.)

"جمع اوری کننده حافظه هرز" خود مدیریت آزاد سازی منابع و استفاده مجدد از اشیا و defrag (یکپارچه سازی) حافظه را بر عهده دارد.

زبان دلفی هم یک نسخه دات نتی به نام Delphi.Net دارد که البته توسط مایکروسافت ارائه نشده و باید بعد از نصب VS به صورت جداگانه روی آن نصب شود.
زبانهای C#.Net و VB.Net و VC++.Net و #J از جمله نمونه های بارز تحت Microsoft Framework.Net هستند.
موفق باشید.

oranoos_92
14-12-2008, 07:35
با تشكر از دوستان عزيز اون لينكي كه دوست عزيز دادند را من خوندم و يكمي ازش فهميدم بچه ها كسي هست زبانش خوب باشه و از اين متن يه خلاصه واسه من بگه:

notice the use of the 'with' statement - you can use a safe without having to declare a local variable for it. When you create a component just pass the 'safe' component as the owner to the constructor. When the execution of the code reaches the 'end' of the 'with' statement the reference count of iobjectsafe will hit 0, the destructor of tobjectsafe will be called and all the components and objects it owns will be freed. So now you have the best of both worlds - you can create an object when you need it, be sure it will be automaticaly destroyed and know exactly when it will happen.

The 'new'/'dispose' methods of iobjectsafe use the 'untyped' pointer type to return a reference to an object - this will cause exception if you mismatch the types of the reference and the actual object created (there won't be a memory leak though), but it is flexible and shorter to type. If you want to play it safe use the 'guard' function instead.

You can also create one iobjectsafe in the constructor of a complex object which uses a lot of internal objects so you don't need to explicitly free them in the destructor.

تشكر

VDeveloper
14-12-2008, 17:05
در واقع این قابلیت از جمله امکانات ذاتی محیط CLR مایکروسافت است و به برنامه های تحت Microsoft Framework.Net ارائه میشود.
این قابلیت فقط مخصوص دات نت نیست، مثلا جاوا هم Garbage Collection دارد. معمولا این قابلیت در زبان های Managed شده وجود داره.
البته دلفی علاوه بر داشتن تعدادی نوع داده Reference-counted، از امکان تعریف Owner برای تعدادی کامپوننت هم پشتیبانی میکنه، که با آزاد شدن Owner، تمام کامپوننت های آن هم آزاد می شوند.


با تشكر از دوستان عزيز اون لينكي كه دوست عزيز دادند را من خوندم و يكمي ازش فهميدم بچه ها كسي هست زبانش خوب باشه و از اين متن يه خلاصه واسه من بگه:
لینک متن اصلی را می دادید بهتر بود.

F A R H A D
14-12-2008, 21:10
البته دلفی علاوه بر داشتن تعدادی نوع داده Reference-counted، از امکان تعریف Owner برای تعدادی کامپوننت هم پشتیبانی میکنه، که با آزاد شدن Owner، تمام کامپوننت های آن هم آزاد می شوند.
البته با در نظر گرفتن این مطلب که مالک تمام اشیا در دلفی TComponent و TObject هست حتی اگر ownerی براشون مشخص نشه، میشه گفت که وقتی اجرای برنامه به پایان میرسه تمام اشیا هم از بین میروند؟

VDeveloper
15-12-2008, 02:17
البته با در نظر گرفتن این مطلب که مالک تمام اشیا در دلفی TComponent و TObject هست حتی اگر ownerی براشون مشخص نشه، میشه گفت که وقتی اجرای برنامه به پایان میرسه تمام اشیا هم از بین میروند؟
TComponent یا TObject مالک تمام اشیاء دلفی نیستند، بلکه کلاس های پایه، یا والد هستند. Owner شی ایی هست که مسئولیت آزاد سازی شی های Child خودش را برعهده داره. کلاس والد کلاسی هست که همه یا بعضی از سایر کلاس ها از آن مشتق می شوند.

در ویندوز، وقتی Processایی بسته میشه، تمام فضای آدرس مربوط به آن آزاد میشه، یعنی چه Memory Leak داشته باشه، چه نداشته باشه، حافظه مورد استفاده اش آزاد میشه. Memory Leak بعد از بسته شدن برنامه معنی نداره، ولی در حین اجرای برنامه، باعث افزایش حافظه مصرفی برنامه، و کاهش منابع آزاد سیستم میشه. اهمیتش هم در برنامه های مختلف یکسان نیست، مثلا یک برنامه که فقط برای چند ثانیه اجرا میشه، اگر یک Memory Leak کوچک هم داشته باشه، خیلی مهم نیست، ولی مثلا اگر درایور کارت گرافیک شما Memory Leak داشته باشه، به سرعت منابع سیستم خورده میشند!

oranoos_92
16-12-2008, 23:10
این قابلیت فقط مخصوص دات نت نیست، مثلا جاوا هم Garbage Collection دارد. معمولا این قابلیت در زبان های Managed شده وجود داره.
البته دلفی علاوه بر داشتن تعدادی نوع داده Reference-counted، از امکان تعریف Owner برای تعدادی کامپوننت هم پشتیبانی میکنه، که با آزاد شدن Owner، تمام کامپوننت های آن هم آزاد می شوند.


لینک متن اصلی را می دادید بهتر بود.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
:11:

VDeveloper
17-12-2008, 02:57
خب، من تازه الان متوجه اون لینک شدم. ببینید، اون چیزی که در اون لینک توضیح داده شده، پیاده سازی یک Garbage Collector هست، یعنی دلفی به خودی خودش Garbage Collection انجام نمیده، حالا یکی رفته برای کارهای خودش با دلفی یک Garbage Collector نوشته. این با قابلیت هایی که یک زبان برنامه نویسی بطور خودکار در اختیار برنامه نویس قرار میده، فرق میکنه. مثلا در دات نت برنامه نویس عملا سر و کاری با Garbage Collector نداره، و خودش هم آن را نمینویسه، بلکه یک قابلیت درونی در دات نت هست که بطور خودکار و بدون دخالت برنامه نویس به جمع آوری زباله می پردازه. پس راه حل مقاله فوق بطور ذاتی در دلفی وجود نداره، بلکه نویسنده خودش برای خودش با استفاده از دلفی (با استفاده از قابلیت Reference-counted بودن Interfaceها ) یک Garbage Collector شخصی بوجود آورده، که در نوع خودش جالب هست.

اون بخشی از مقاله هم که شما Quote کردید، داره در واقع به قابلیت این Garbage Collector شخصی اشاره میکنه. منظورش این هست که، در شرایط عادی، باید بعد از اتمام کار، کامپوننت ساخته شده Free میشده، ولی در روشی که نویسنده استفاده کرده، یک کلاس پایه برای کامپوننت ها استفاده کرده که این کلاس پایه خودش یک Interface را پیاده سازی میکنه، و بخاطر همین Reference-counted هست. در کد مورد نظرش، تا زمانی که کد داخل With در حال اجرا ست، ObjectSafe که شی ای از همون کلاس پایه هست، معتبر هست. اگر کامپوننت هایی که در داخل بلوک with ساخته شدند، Ownerشان برابر ObjectSafe باشه، با پایان بلوک with شمارش گر مرجع ObjectSafe = 0 میشه، و در این حالت، Destructor مربوط به ObjectSafe اجرا میشه. چون اون کامپوننت ها ObjectSafe را به عنوان Owner خودشان تعیین کرده بودند، با آزاد شدن ObjectSafe، آنها هم آزاد میشند.

Interfaceها از دلفی 3 به بعد به دلفی اضافه شدند، در حالی که ساختار اصلی VCL و بخصوص کامپوننت ها، تا قبل از آن تعیین شده بود، و نمیشد در آنها تغییرات بنیادینی بوجود آورد تا از قابلیت های بسیار زیاد Interfaceها استفاده کنند، چون در این صورت حجم زیادی از کدهایی که کاربران نوشته بودند، با مشکل مواجه میشد. برای همین هم حضور Interfaceها در VCL کمرنگ هست. اما افرادی که بنا بر ضرورت های کاری، Frameworkهایی برای خودشان یا شرکتشان تولید می کنند، مجبور نیستند بر اساس همان ساختار سنتی VCL این کار را انجام بدهند، و می توانند از قابلیت های Interfaceها به میزان بسیار بیشتری استفاده کنند.

oranoos_92
19-12-2008, 11:08
developer
جان خيلي ممنون از شما
ميشه يه لطفي بكنيد و در مورد اين متد
Reference-counted
يه توضيحي بفرمائيد
تشكر

VDeveloper
19-12-2008, 22:00
در مورد اين متد
reference-counted
يه توضيحي بفرمائيد
شما جای دیگه هم این سوال را پرسیدید، و جواب خودتان را گرفتید.

موفق باشید