کدنویس۲۱

کدنویس۲۱

با کد نویس 21 کد نویس باشید.
کدنویس۲۱

کدنویس۲۱

با کد نویس 21 کد نویس باشید.

کلمه کلیدی new و delete در c++

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

 

 

خب دوستان امروز براتون درباره new مطلب آماده کردم.

آنهایی که زبان های مثل c# یا java کار کردند می دانند که برای ساخت یک نمونه از یک کلاس باید کد زیر را نوشت:

1
Entity e = new Entity();

اما در c++ می توانیم کد زیر را بنویسیم در این حالت نیاز به new نداریم و کنستراکتر کلاس صدا زده شده است:

1
Entity e;

استفاده های new:

از new زمانی استفاده می شود که یا بخواهیم یک آرایه بسازیم:

1
int t[] = new int[50];


یا اینکه بخواهیم یک متغیر را در حافظه heap بسازیم و کلا کلمه new برای ساخت شی به کار می رود.


فرق حافظه heap و stack: چیز هایی که در حافظه stack تعریف می شوند، وقتی از scope بیایم بیرون(به } برسیم) پاک می شوند و دیگر قابل دسترسی نیستند امّا در حافظه heap اینگونه نیست و ما هر وقت بخواهیم می توانیم آن را پاک کنیم.


کلمه new دقیقا چیست؟

 اگر در ویژوال استودیو روی آن راست کلیک کنیم و گزینه go to definition رو بزنیم با عبارت زیر روبرو می شویم:

1
2
3
void* __CRTDECL operator new(
    size_t _Size
    );

که نشان می دهد new مانند + و - یک operator است و یک سایز(اندازه) را به عنوان پارامتر(ورودی) می گیرد و یک پوینتر void را برمی گرداند.


کلمه کلیدی new مانند تابع malloc عمل میک  این تابع هم یک سایز می گیرد و یک پوینتر void را برمی گرداند.

1
2
3
void* __cdecl malloc(
    _In_ _CRT_GUARDOVERFLOW size_t _Size
    );

ما می توانیم به جای new از تابع malloc به صورت زیر استفاده کنیم:

1
2
Entity* e = new Entity;
   Entity* en = (Entity*)malloc(sizeof(Entity));

در کد دوم ما با sizeof اندازه کلاسمون را بر حسب بایت گرفتیم و به malloc دادیم و چون malloc یک پوینتر void را برمی گرداند باید ما آن را به پوینتر از نوع Entity تبدیل(cast) کنیم. دو عبارت بالا کاملاً مثل هم هستند با این تفاوت که عبارت اوّل کنستراکتر کلاس را صدا می زند امّا عبارت دوّم فقط یک نمونه از کلاس ما در مموری می سازد و کنستراکتر را صدا نمی زند. وقتی ما از new استفاده می کنیم و متغیری را در حافظه ی heap می‌سازیم بعد از اینکه کارمان باهاش تمام شد باید حتما آن را با delete به صورت زیر پاک کنیم:

1
 delete e;

اگر هم می خواستیم آرایه را پاک کنیم باید به صورت زیر عمل کنیم:

1
  delete[] e; 

ما می توانیم به جای delete از تابع free استفاده کنیم:

1
  free(e); 

هنگام استفاده از delete ما دیستراکتور کلاس هم صدا می زنیم ولی در free دیستراکتور صدا زده نمی شود و فقط متغیر ما از مموری حذف می شود.

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد