View Full Version : آزاد کردن حافظه
Delphi7_love
یک شنبه 02 آبان 1389, 17:07 عصر
یه متغیر که تعریف می کنیم ، بعد چطور میشه حافظه تخصیص داده شده به این متغیر رو از بین برد ؟
Felony
یک شنبه 02 آبان 1389, 17:19 عصر
مگه شما بهش حافظه اختصاص دادی که حالا بخوای حافظه اختصاصی رو آزاد کنی ؟ در دلفی مدیریت حافظه متغییرها با خود کامپایلر هست .
vcldeveloper
یک شنبه 02 آبان 1389, 17:29 عصر
یه متغیر که تعریف می کنیم ، بعد چطور میشه حافظه تخصیص داده شده به این متغیر رو از بین برد ؟
چه نوع متغیری؟ در کجا تعریف کردید؟
Delphi7_love
یک شنبه 02 آبان 1389, 18:00 عصر
مگه شما بهش حافظه اختصاص دادی که حالا بخوای حافظه اختصاصی رو آزاد کنی ؟ در دلفی مدیریت حافظه متغییرها با خود کامپایلر هست .
من در این مورد زیاد اطلاع ندارم
ولی فکر می کنم با هر با اجرای یک رویه ، متغیر های تعریف شده در اون یک حافظه دوباره به همون متغرها داده میشه ، یعنی متغیرهای دفعه قبل که رویه اجرا شده بود هنوز در حافظه هستند و بعد از مدتی کار کردن با برنامه مقداری از حافظه اشغال میشه که میخوام از این کار جلوگیری کنم
البته نمیدونم اصلا حرفم درست هست یا نه.
چه نوع متغیری؟ در کجا تعریف کردید؟
مثلا یه button داریم که دوتا متغیر از نوع integer در اون تعریف شده و هر بار که این باتن اجرا شه
میخوام اگه متغیرهای دفعه قبل از حافظه خارج نشده ، خارجشون کنم
****************
داخل C# یه دستوری هست به شکل زیر :
x.dispose
امیدوارم منظورم رو درست گفته باشم
Felony
یک شنبه 02 آبان 1389, 18:07 عصر
من در این مورد زیاد اطلاع ندارم
ولی فکر می کنم با هر با اجرای یک رویه ، متغیر های تعریف شده در اون یک حافظه دوباره به همون متغرها داده میشه ، یعنی متغیرهای دفعه قبل که رویه اجرا شده بود هنوز در حافظه هستند و بعد از مدتی کار کردن با برنامه مقداری از حافظه اشغال میشه که میخوام از این کار جلوگیری کنم
البته نمیدونم اصلا حرفم درست هست یا نه.
مثلا یه button داریم که دوتا متغیر از نوع integer در اون تعریف شده و هر بار که این باتن اجرا شه
میخوام اگه متغیرهای دفعه قبل از حافظه خارج نشده ، خارجشون کنم
****************
داخل C# یه دستوری هست به شکل زیر :
x.dispose
امیدوارم منظورم رو درست گفته باشم
خیر حرفتون درست نیست ، متغییرهای معمول مثل Byte و Integer و String و ... توسط خود کامپایلر دلفی مدیریت میشن و بعد از اتمام کار یک روال یا روتین به صورت خودکار حافظه اونها آزاد میشه و از لحاظ مدیریت حافظه مشکلی برای برنامه ایجاد نمیشه .
بحث اشاره گرها و اشیائی که خودتون میسازید جدا هست ، هر شیئی که خودتون بهش حافظه رو اختصاص بدید خودتون هم مسئول آزاد سازیش هستید .
Delphi7_love
یک شنبه 02 آبان 1389, 18:15 عصر
ممنون
امروز برنامه نویس c# داشتیم که استاد در این مورد صحبت کرد
واسه همین این سوال برام پیش اومد
vcldeveloper
یک شنبه 02 آبان 1389, 18:35 عصر
مثلا یه button داریم که دوتا متغیر از نوع integer در اون تعریف شده و هر بار که این باتن اجرا شه
میخوام اگه متغیرهای دفعه قبل از حافظه خارج نشده ، خارجشون کنم
منظورتون تعریف متغیر در button نیست، بلکه منظورتون تعریف متغیر در متدی هست که به عنوان event handler برای رویداد OnClick آن Button می نویسید.
متغیری که شما در داخل یک تابع یا یک متد تعریف می کنید، Scope اش محدود به همان تابع یا متد هست؛ یعنی با خارج شدن از کد آن تابع یا متد، اون متغیر هم نامعتبر میشه.
اگر متغیر مربوطه یک شی یا یک pointer باشه، داده ایی که بهش اشاره شده، همچنان در حافظه باقی میمانه، غیر از اینکه قبل از خروج از تابع یا متغیر، آن شی را Free کنید، یا داده اشاره شده با pointer را آزاد کنید.
اگر متغیر مربوطه string یا interface یا آرایه دینامیک باشه، مقدار reference counter آن یک واحد کاهش پیدا میکنه، و اگر به صفر برسه، به طور خودکار آزاد میشه. لازم نیست شما کاری برای آزاد سازی اش بکنید.
اگر این متغیر حاوی handle یکی از منابع سیستم عامل باشه (مثل هندل یک DLL یا هندل یک File و غیره) باید متناسب با مستندات سیستم عامل آن را آزاد کرد. در برخی مواقع لزومی نداره شما کار خاصی انجام بدید، در بعضی از مواقع هم باید تابع API خاصی که سیستم عامل بهتون معرفی میکنه را در پایان کار فراخوانی کنید، تا سیستم عامل متوجه بشه که کارتون با اون منابع تمام شده، و آنها را آزاد کنه.
اگر متغیر مربوطه از نوع داده های ساده (مثل Integer, Byte, Double, Real, Char و غیره) یا آرایه های استاتیک، یا رکورد ها باشه؛ با خروج از Scope مربوطه، فضای اختصاص داده شده به اون متغیر هم به طور خودکار آزاد میشه.
در مثال شما (تعریف دو متغیر integer)، لازم نیست کار خاصی صورت بگیره، چون با خروج از کد آن متد، متغیرهای مورد نظر شما هم آزاد میشند.
امروز برنامه نویس C# داشتیم که استاد در این مورد صحبت کرد
در #C غیر از موارد اول و دومی که در بالا بهشون اشاره کردم، در سایر موارد، وضع به همین شکلی هست که برای دلفی گفتم. در اون دو مورد، در حالت اول (اشیاء) #C از Garbage Collector استفاده میکنه، و اون مشخص میکنه که کی باید شی ایی آزاد بشه، و هر زمان که لازم بود شی آزاد بشه، اون رو خودش آزاد میکنه. در مورد دوم (string ها)، در #C مثل دلفی مدیر این داده ها به طور خودکار صورت میگیره، ولی برخلاف دلفی، از Reference Counter برای آنها استفاده نمیشه، بلکه اینها را هم خودِ Garbage Collector مدیریت میکنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.