سلام

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

بیایید یک برنامه ی ساده تر بنویسیم. مثلا تعریف یک متغیر int در heap:

int *a = new int;

توضیح این خط: وقتی که new را صدا می زنیم (مثلا در مثال بالا)، compiler یک متغیر در heap ایجاد می کند و سپس آدرس آن را به ما می دهد. حالا برای ذخیره ی این آدرس باید از اشاره گر استفاده کنیم. پس خط بالا یک خانه از heap را اشغال کرده و آدرس آن را در اشاره گر a می ریزد.

به این کار allocate کردن می گویند.

استفاده از a مانند استفاده از یک اشاره گر معمولی است که طرز استفاده از آن را در پست های قبلی توضیح داده ایم. مثلا برای تغییر مقدار آن خانه در heap، به صورت زیر عمل می کنیم:

*a = 6;

حالا فرض کنید که کار ما با این متغیر تمام شده است و دیگر به آن نیازی نداریم. اگر متغیر در stack تعریف شده بود، آن را رها کنید. با اتمام برنامه، آن متغیر نیز پاک خواهد شد اما اگر متغیر در heap تعریف شده باشد، دیگر نباید آن را رها کرد زیرا خود به خود پاک نمی شود و با پایان برنامه نیز بر جا می ماند. این اتفاق سبب غیرقابل استفاده شدن خانه ی مربوطه از heap می شود. برای آزادسازی خانه ی مربوطه از heap باید مانند کد زیر عمل کنید:

delete a;

این خط باعث می شود که خانه ای که a به آن اشاره می کند، آزاد شود. یعنی از این به بعد سیستم عامل می تواند اطلاعات این خانه را عوض کند. حواستان باشد که حتما قبل از اتمام برنامه از delete استفاده کنید وگرنه این خانه از حافظه تا هنگامی که رایانه روشن است، غیر قابل استفاده می شود.

به این کار deallocate کردن می گویند.

برای این مبحث تمرین خاصی موجود نیست، شما می توانید استفاده از آن ها را خودتان تمرین کنید.

موفق باشید!