دستورات (new و delete) در ++C (قسمت اول)

سلام سلام سلام.

اومدم با یه پست دیگه.

تو این پست میخوام به صورت کامل عملگر های new و delete زبان سی پلاس پلاس رو توضیح بدم.

خب اولین سوالی که پیش میاد اینه که اصلا این دو عملگر چی هستند ، کارشون چیه و چه جاهایی استفاده ازشون بدرد میخوره.

بزارید موضوع رو ریز تر کنیم و عمیق تر وارد بشیم.

هنگامی که ما یک نوع متغیر با هر نوع داده ای تو برنامه تعریف میکنیم ، این متغیر بنا به نوعش یک مقدار فضایی رو تو حافظه رم اشغال میکنه و تا زمانی که برنامه در حال اجرا هست حتی زمانی که از متغیر استفاده نمیکنیم و اصلا نیازی تو برنامه بهش نیست ، این متغیر کماکان این فضا رو اشغال میکنه و وقتی که برنامه بسته بشه ، حافظه ای که توسط متغیر اشغال شده بود آزاد میشه. و خب این خیلی بده و در روند برنامه و سخت افزار خلل ایجاد میکنه.(البته شاید در برنامه هایی با مقیاس کوچیک به چشم نیاد ولی تو برنامه های بزرگ خیلی واضح خودش رو نشون میده)

خب دومین سوالی که پیش میاد اینه که چه راه حلی برای این مشکل هست ؟

برای جلوگیری از این مشکل کافیه تا دست به دامن اختصاص حافظه پویا.(Dynamic Memory Allocation)

سومین سوالی که پیش میاد،آقا اینی که میگی اصلا چی هست؟

همونطور که از اسمش معلومه زمانی که ما یک متغیر با این روش تعریف میکنیم قسمتی در حافظه رم رو به خودش اختصاص میده و هر زمان که کارمون با متغیر تموم شد و دیگه نیازی بهش نیست میتونیم اون حافظه رو از متغیر بگیریم و در عمل یعنی متغیر رو حذف کنیم.

چهارمین سوالی که پیش میاد اینه که چطوری این کار رو انجام بدیم؟

انجام این کار خیلی ساده هست فقط کافیه از عملگر new استفاده کنی.

حالا این عملگر دقیقا میاد چیکار میکنه؟

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

سینتکس دستور به صورت زیر هست :

PointerType  *PinterName  =  new  DataType;

برای اینکه یکم بهتر جا بیفته این بحث و بهتر متوجه بشید چند تا مثال با هم مینویسیم :

خب همونطور که از مثال بالا معلومه با توجه به سینتکس دستور اومدیم یک حافظه برای نگهداری داده ی عددی نوع int درخواست کردیم و حافظه برگشتی رو به یک اشاره گر هم نوع داده اختصاص دادیم.(نکته : نوع داده و نوع اشاره گر باید همسان باشند)

برای مقدار دهی و دسترسی هم دیگه باید دانش اشاره گر ها رو داشته باشید تا بتونید این اعمال رو انجام بدید ولی ما چند تا مثال میزنیم تا دید شما نسبت به این موضوع وسیع تر بشه :

مثال بالا میاد و با استفاده از عملگر دسترسی به محتوا مقدار 1383 رو در حافظه اعمال میکنه.

شاید براتون سوال پیش بیاد که آیا روش ساده تری برای اینکار هست ؟ روشی که در زمان تعریف مقدار رو در حافظه اعمال کنه؟

جواب بله هست.

قطعه کد بالا دقیقا عملکردی مشابه با مثال قبل داره.


خوب حالا زمان این رسیده که بیایم مقدار اختصاص داده شده در پس بگیریم. یا اصطلاحا حذفش کنیم.

برای حذف کافیه تنها از سینتکس زیر پیروی کنیم :

delete PointerName;

دستور بالا میاد حافظه اختصاص داده شده رو پس میگیره.

برای درک بیشتر به مثال زیر توجه کنید :

تو مثال بالا ما در حقیقت اومدیم از روش تخصیص حافظه پویا استفاده کردیم.

مثال بالا میاد ابتدا یک اشاره گر که به قسمتی از حافظه که مقدار 1383 درش اعمال شده تعریف میکنه و بعد میاد اون قسمت حافظه رو از اشاره گر پس میگیره و یا در اصطلاح حذف میکنه.


برای اینکه دیگه کامل این بحث رو درک کنید یه مثال به همراه خروجی براتون قرار میدم :

برنامه :

خروجی :

با توجه به توضیحات قبلی مثال بالا درک کارش ساده هست.


و در آخر بزرگترین سوالی که پیش میاد اینه که آیا تخصیص حافظه پویا فقط برای متغیر امکان پذیره ؟

پاسخ خیر هست.

برای آرایه ها و تمام داده های استاندارد در زبان سی پلاس پلاس و یا حتی کلاس (class) ها هم شما میتونید حافظه پویا اختصاص بدید.

تو قسمت بعدی ادامه ی این بحث رو با هم یادمیگیریم.


راستی رفقا من یه چنل یوتوب دارم که توش علوم کامپیوتر و سیستم های دیجیتال و .... رو آموزش میدم خوشحال میشم بهم سر بزنید و با حمایت هاتون ما رو خوشحال کنید.

آدرس کانال یوتوب : CODE ISLAND - YouTube

اگه پست برات مفید بود بی زحمت لایکش کن.

هر سوالی راجب این پست داری تو بخش کامنت ها مطرح کن در سریع ترین وقت ممکن پاسخ میدم.


تا قسمت بعدی بدرورد.