در برنامهنویسی، حافظه به شکلی سازماندهی میشه که برنامه بتونه دادهها رو به صورت مؤثر مدیریت کنه. دو نوع حافظه اصلی که همیشه در کار با زبانهای برنامهنویسی شیگرا باهاشون سروکار داریم، stack و heap هستند. در اینجا میخوایم ابتدا با تفاوتهای این دو نوع حافظه آشنا بشیم و سپس نقش اونا رو در مدیریت شیها بررسی کنیم.
حافظه stack یک بخش از حافظه است که به صورت خودکار و سریع عمل میکنه. هر وقت یک تابع یا متد (method) در برنامه اجرا میشه، فضای مورد نیاز برای متغیرهای محلی و پارامترهای ورودی توی stack ذخیره میشه. این حافظه بسیار سریعه، چون به شکل خودکار مدیریت میشه. هر وقت تابع به انتها میرسه، حافظه مربوط به اون تابع به طور خودکار آزاد میشه.
ویژگیهاش از این قرارن :
در مقابل stack، حافظه heap وجود داره که انعطافپذیری بیشتری داره و برای دادههایی استفاده میشه که نیاز داریم تا طولانیتر از یک تابع یا متد در دسترس بمونن. اما مدیریت heap به صورت دستی انجام میشه، یعنی برنامهنویس باید خودش حافظه رو اختصاص بده و در زمان مناسب هم اون رو آزاد کنه. وقتی دادهای رو در heap ذخیره میکنیم، این داده تا زمانی که به صورت صریح (مثلاً با دستور delete) حذف نشه، توی حافظه باقی میمونه.
ویژگیهاش از این قرارن :
حالا که با تفاوتهای بین stack و heap آشنا شدیم، وقتشه بریم سراغ موضوع اصلی: چطور از این مفاهیم در برنامهنویسی شیگرا استفاده کنیم؟
به طور معمول، وقتی یک شی داخل یک تابع تعریف میشه، اون شی در حافظه stack ذخیره میشه و با اتمام تابع، به طور خودکار از بین میره. اما اگر بخوایم شیهایی تعریف کنیم که بعد از اتمام تابع هم زنده بمونن و بشه بیرون از تابع هم بهشون دسترسی داشت، باید از حافظه heap استفاده کنیم. اینجاست که new وارد عمل میشه.
برای این کار باید از new استفاده کنیم. new یک فضای جدید در heap اختصاص میده و شی رو اونجا ذخیره میکنه. به این ترتیب، شی حتی بعد از تموم شدن تابع همچنان در حافظه باقی میمونه.
اینجوری هم می تونیم بگیم که new ابتدا یک شی در حافظه heap ایجاد میکنه و سپس آدرس اون شی رو بهعنوان یک اشارهگر (pointer) برمیگردونه. به عبارت دیگه، خود شی در حافظه ساخته میشه، اما چیزی که ما دریافت میکنیم، آدرس اون شی است، نه خود شی. به همین دلیل، برای دسترسی به اعضا و متدهای شی، باید از اشارهگر استفاده کنیم.
که برای این میایم با استفاده از علامت (*)، به شیای که اشارهگر بهش اشاره میکنه دسترسی پیدا می کنیم. یعنی در واقع شی رو از طریق اشارهگر بازیابی میکنیم و بعد به اعضای اون دسترسی داریم.
خلاصه بگم چون new آدرس شی رو برمیگردونه، همیشه باید از اشارهگرها برای تعامل با شیهایی که در heap ساخته شدن استفاده کنیم.
شیهایی که در heap تعریف میشن، به صورت خودکار از حافظه حذف نمیشن. یعنی اگه شما به سیستم نگید که اون شی رو پاک کنه، همچنان توی حافظه باقی میمونه. اینجا باید از دستور delete استفاده کنیم تا شیهای ساختهشده رو پاک کنیم و حافظه رو آزاد کنیم.
در برنامهنویسی شیگرا داخل MQL5، وقتی بخوایم دادهها یا شیهایی داشته باشیم که طول عمر بیشتری از یک تابع داشته باشن، باید از حافظه heap استفاده کنیم. این کار رو با دستور new انجام میدیم و توجه داشته باشیم که مدیریت حافظه در heap دستی هست، پس باید به کمک delete، شیهای اضافه رو از حافظه حذف کنیم تا دچار مشکلاتی مثل پر شدن حافظه نشیم.