تفاوت new / delete با malloc / free

اگر با زبان C کار کرده باشید احتمالا با کلیدواژه‌های malloc و free که برای گرفتن و آزاد کردن حافظه از Heap هستند آشنا هستید. از طرفی ممکن است شنیده باشید که معادل این‌ها در C++ کلید واژه‌های new و delete هستند. اما این به این معنی نیست که در کامپایلر C++ نمی‌توانیم از malloc / free استفاده کنیم. پس آیا واقعا هیچ تفاوتی نیست و فرقی نمی‌کند که کدام را استفاده کنیم؟

جواب کوتاه خیر است و البته جواب بلندتر را در ادامه بهش می‌پردازیم.

۱- فراخوانی constructor و destructor :

وقتیکه new را جهت گرفتن حافظه برای یک object استفاده می‌کنیم، constructor کلاس آن شی فراخوانی می‌شود. به همین ترتیب وقتی delete را برای آزاد کردن آن بکار می‌بریم،  destructor فراخوانی می‌شود. در حالیکه اگر این کار را با malloc و free انجام دهیم، این ۲ تابع فراخوانی نمی‌شوند.

۲- خروجی * void :

وقتیکه از تابع malloc برای گرفتن حافظه استفاده می‌شود، نوعی که بر می‌گرداند * void است. به همین دلیل لازم است که خودمان با cast کردن مشخص کنیم که قرار است این حافظه برای چه نوع داده‌ای مورد استفاده قرار گیرد.

char *str = (char *)malloc(100);

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

char *str = new char[100];

۳- عدم موفقیت در گرفتن حافظه:

اگر به دلیل پر شدن حافظه heap، تابع  malloc نتواند برای ما حافظه بگیرد، خروجی اش NULL خواهد بود. اما در new  یک Exception از نوع std::bad_alloc برای ما Through خواهد شد. مگراینکه مانند خط زیر از nothrough استفاده کنیم.

int *p = new(nothrow) int;

که در این صورت همانند تابع malloc اگر نتواند حافظه بگیرد، NULL را بر می‌گرداند.

۴- مخرن حافظه:

توابع malloc و free با حافظه‌ی Heap کار می‌کنند. در حالیکه new و delete از Free Store. اگرچه اغلب در عمل Free Store و Heap به یک مخزن حافظه اشاره دارند اما اصلا توصیه نمی‌شود که مثلاً با malloc حافظه را بگیریم و با delete آن را آزاد کنیم. چراکه ممکن است این دو مخرن حافظه مجزا باشند.

۵- میزان حافظه:

هنگام فراخوانی malloc لازم است تعداد بایت‌های لازم رو به عنوان ورودی بهش بدیم. در حالیکه برای new اینکار لازم نیست و خود کامپایلر تشخیص می‌دهد -با توجه به نوع داده‌ای که قرار است برایش حافظه بگیرد- چه میزان حافظه نیاز دارد.

به غیر این ۵ تا مورد تفاوت‌های دیگه هم گفته میشه که به نظرم گفتنشون خیلی لازم نبود. اگر خواستید این تفاوت‌ها رو هم ببینید به این لینک از استک اورفلو مراجعه کنید. اگر تفاوت دیگری هم هست که فکر میکنید لازم بود من بیارمش، حتما برام تو کامنت‌ها بنویسید.

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.