برای درک بهتر اشاره گرها نیاز است درباره نحوه ذخیره اطلاعات درحافظه بیشتر بدانید. حافظه RAM شامل مجموعه ای از محل های ذخیره سازی است که هر محل توسط یک آدرس منحصر بفرد مشخص می شود. وقتی برنامه ای را اجرا می کنید کد برنامه (دستورالعمل های زبان ماشین برنامه) و داده هائی که برنامه با آنها کار می کند در حافظه قرار می گیرند. اگر متغیری در برنامه تعریف شده باشد کامپایلر محلی از حافظه را برای آن کنار گذاشته آدرس آنرا به اسم متغیر مربوط می کند. بنابراین وقتی در برنامه از اسم متغیر استفاده می شود اتوماتیک به آدرس موردنظر مراجعه می شود.
اشاره گرها وقتی نقش ایفا می کنند که بخواهیم از حافظه پویا (يا heap) استفاده کنیم. ناحيه Heap فضای آزاد حافظه است که در اختيار هيچ برنامه ای نيست و می تواند به صورت پويا استفاده می شود، يعنی در حين اجرای برنامه در صورت نياز اختصاص داده می شود و هنگامی که ديگر به آن احتياج نباشد آزاد می شود.
دستورات new و delete برای تخصيص و بازپس گيری حافظه هنگام کار با حافظه پويا استفاده می شوند.
دستور new فضائی از حافظه آزاد را به برنامه اختصاص می دهد. میزان فضای موردنیاز توسط نوع داده ای که بعد از دستور ذکر می شود تعیین می شود. اگر دستور موفق باشد اشاره گری به فضای گرفته شده را برمیگرداند. اگر شکست بخورد مقدار NULL را برمیگرداند.
بعد از اینکه کار با حافظه پویا باید حافظه گرفته شده توسط دستور delete پس داده شود. به این ترتیب حافظه می تواند مجدد توسط برنامه های دیگر استفاده شود.
مثال.
IntPtr = new int;
if (IntPtr == NULL) {
cerr << "Could not allocate sufficient space" << endl;
exit(1);
}
*IntPtr = 55;
delete IntPtr;
IntPtr = 0;
بعد از delete یک اشاره گر آترا با مقدار 0 پر کنید تا تصادفا آن را دوباره استفاده نکنید.
اگر فضا های گرفته شده از حافظه آزاد پس داده نشود و برنامه خاتمه پیدا کند برنامه اصطلاحا دارای مشکل memory leak است. میزان حافظه موجود یعد از اجرای برنامه کمتر از قبل از اجرای آن است. مگراینکه کامپیوتر راه اندازی مجدد شود. بنابراین سعی کنید همیشه حافظه های گرفته شده را آزاد کنید.
دستورات new و delete دو حالت دارند؛ برای آرایه ها اين دو دستور به صورت زیر استفاده می شوند.
new[]();
delete[]();
مثال. برنامه زیر از حافظه پویا استفاده می کند. به آرایه a به اندازه 10 عدد صحیح حافظه اختصاص داد ه می شود. به b عددی صحیحی اختصاص می دهد با مقدار اولیه 89.
#include <iostream.h>
int main() {
int * a= new int[10];
int * b=new int(89) ;
cout << "*b=" << *b << endl;
*(a+5)=9;
cout << "a[5]=" << *(a+5) << endl;
delete [] a;
delete b;
return 0;
}
نکته. برای هر دستور new یک دستور delete باید باشد.
نکته. بررسی کنید دستور new خطا یا NULL برنگردانده باشد.
نکته. برای آرایه ها [] در دستورات new و delete لازم است.
نکته. توابع ()malloc و ()free معادل دستورات new و delete هستند.
اشاره گرها وقتی نقش ایفا می کنند که بخواهیم از حافظه پویا (يا heap) استفاده کنیم. ناحيه Heap فضای آزاد حافظه است که در اختيار هيچ برنامه ای نيست و می تواند به صورت پويا استفاده می شود، يعنی در حين اجرای برنامه در صورت نياز اختصاص داده می شود و هنگامی که ديگر به آن احتياج نباشد آزاد می شود.
دستورات new و delete برای تخصيص و بازپس گيری حافظه هنگام کار با حافظه پويا استفاده می شوند.
دستور new فضائی از حافظه آزاد را به برنامه اختصاص می دهد. میزان فضای موردنیاز توسط نوع داده ای که بعد از دستور ذکر می شود تعیین می شود. اگر دستور موفق باشد اشاره گری به فضای گرفته شده را برمیگرداند. اگر شکست بخورد مقدار NULL را برمیگرداند.
بعد از اینکه کار با حافظه پویا باید حافظه گرفته شده توسط دستور delete پس داده شود. به این ترتیب حافظه می تواند مجدد توسط برنامه های دیگر استفاده شود.
مثال.
IntPtr = new int;
if (IntPtr == NULL) {
cerr << "Could not allocate sufficient space" << endl;
exit(1);
}
*IntPtr = 55;
delete IntPtr;
IntPtr = 0;
بعد از delete یک اشاره گر آترا با مقدار 0 پر کنید تا تصادفا آن را دوباره استفاده نکنید.
اگر فضا های گرفته شده از حافظه آزاد پس داده نشود و برنامه خاتمه پیدا کند برنامه اصطلاحا دارای مشکل memory leak است. میزان حافظه موجود یعد از اجرای برنامه کمتر از قبل از اجرای آن است. مگراینکه کامپیوتر راه اندازی مجدد شود. بنابراین سعی کنید همیشه حافظه های گرفته شده را آزاد کنید.
دستورات new و delete دو حالت دارند؛ برای آرایه ها اين دو دستور به صورت زیر استفاده می شوند.
new[]();
delete[]();
مثال. برنامه زیر از حافظه پویا استفاده می کند. به آرایه a به اندازه 10 عدد صحیح حافظه اختصاص داد ه می شود. به b عددی صحیحی اختصاص می دهد با مقدار اولیه 89.
#include <iostream.h>
int main() {
int * a= new int[10];
int * b=new int(89) ;
cout << "*b=" << *b << endl;
*(a+5)=9;
cout << "a[5]=" << *(a+5) << endl;
delete [] a;
delete b;
return 0;
}
نکته. برای هر دستور new یک دستور delete باید باشد.
نکته. بررسی کنید دستور new خطا یا NULL برنگردانده باشد.
نکته. برای آرایه ها [] در دستورات new و delete لازم است.
نکته. توابع ()malloc و ()free معادل دستورات new و delete هستند.