موصى به, 2021

اختيار المحرر

الفرق بين الجديد و malloc ()

وتستخدم new و malloc () على حد سواء لتخصيص الذاكرة بشكل حيوي. على الرغم من أن الجديد و malloc () مختلفة في العديد من السياقات. الفرق الأساسي بين new و malloc () هو أن الجديد هو المشغل ، وتستخدم بمثابة بناء. من ناحية أخرى ، malloc () هي وظيفة مكتبة قياسية ، تستخدم لتخصيص الذاكرة في وقت التشغيل. تتم مناقشة الاختلافات الأخرى بينهما أدناه في مخطط المقارنة:

رسم بياني للمقارنة

أساس للمقارنةالجديدmalloc ()
لغةالمشغل الجديد هو ميزة محددة في C ++ و Java و C #.وظيفة malloc () هي ميزة من C.
طبيعة"جديد" هو المشغل.malloc () هي وظيفة.
حجم( )جديد لا يحتاج إلى مشغل sizeof لأنه يسمح بتخصيص ذاكرة كافية لنوع معينmalloc يتطلب مشغل sizeof لمعرفة حجم الذاكرة لديها لتخصيص.
البناءيمكن للمشغل الجديد استدعاء مُنشئ كائن.malloc () لا يمكن على الإطلاق إجراء مكالمة إلى منشئ.
التهيئةعامل التشغيل الجديد يمكن تهيئة كائن أثناء تخصيص الذاكرة إليه.لا يمكن أن تتم تهيئة الذاكرة في malloc.
الحمولة الزائدةالمشغل الجديد يمكن أن يكون فوق طاقته.لا يمكن أن يكون overoced malloc ().
بالفشلعند الفشل ، يقوم عامل التشغيل الجديد بطرح استثناء.عند الفشل ، malloc () بإرجاع فارغة (NULL).
إلغاء تخصيصتخصيص الذاكرة من جديد ، deallocated باستخدام "حذف".يتم تخصيص تخصيص الذاكرة بواسطة malloc () باستخدام وظيفة free ().
إعادة توزيعالمشغل الجديد لا يعيد تخصيص الذاكرة.يمكن تخصيص الذاكرة المخصصة من malloc () باستخدام realloc ().
إعدامالمشغل الجديد يقطع وقت التنفيذ.يتطلب malloc () المزيد من الوقت للتنفيذ.

تعريف جديد

المشغل الجديد هو عامل تخصيص ذاكرة يقوم بتخصيص الذاكرة بشكل حيوي. يخصص المشغل الجديد الذاكرة في الكومة ويعيد عنوان البداية لتلك الذاكرة التي تم تعيينها لمتغير مرجع. المشغل الجديد يشبه malloc () في C. ومع ذلك ، مترجم C ++ متوافق مع malloc () ، ولكن ، من الأفضل استخدام المشغل الجديد لأنه يحتوي على مزايا معينة أكثر من malloc (). بناء جملة المشغل الجديد هو كما يلي:

 type variable_name = new type (parameter_list)؛ 

هنا ، يشير "type" إلى نوع البيانات للمتغير الذي يجب تخصيص الذاكرة له. الكلمة "variable_name" هي الاسم المعطى للمتغير المرجعي الذي يحمل المؤشر إلى الذاكرة. يحدد الأقواس هنا استدعاء منشئ. إن parameter_list عبارة عن قائمة بالقيم التي تم تمريرها إلى المُنشئ لتهيئة الكائن الذي تم إنشاؤه حديثًا.

يخصص المشغل الجديد ذاكرة كافية مطلوبة لكائن من نوع معين. وبالتالي ، فإنه لا يتطلب مشغل sizeof () ولا يتطلب تغيير حجم الذاكرة مثل malloc () الذي يستخدم realloc () لإعادة تخصيص الذاكرة. المشغل الجديد هو بناء ؛ فإنه يستدعي منشئ كائن أثناء التعريف الذي يستخدم عادة لتهيئة الكائن.

نعلم أن المشغل الجديد يخصص الذاكرة في كومة الذاكرة المؤقتة وحجم الكومة محدودة. لذلك ، إذا كان ذاكرة التخزين المؤقتة نفدت في الذاكرة ومحاولة عامل جديد لتخصيص الذاكرة ، فإنه سيؤدي إلى فشل المشغل الجديد. إذا فشل المشغل الجديد في تخصيص الذاكرة ، فسيؤدي ذلك إلى طرح استثناء ، وإذا لم تتمكن الشفرة من معالجة هذا الاستثناء ، فسيتم إنهاء البرنامج بشكل غير طبيعي.

يمكن تحرير الذاكرة المخصصة من قبل المشغل الجديد باستخدام مشغل الحذف. يقوم المشغل الجديد بقطع وقت التنفيذ لأنه مشغل ، وليس وظيفة.

تعريف malloc ()

و malloc () هي وظيفة تستخدم لتخصيص كمية الذاكرة المطلوبة على كومة الذاكرة المؤقتة. ترجع الطريقة مؤشر نوع "void" الذي هو أبعد من ذلك ، اكتب cast للحصول على مؤشر إلى ذاكرة من نوع محدد ويتم تعيين هذا المؤشر إلى الذاكرة إلى متغير مرجع. تشبه وظيفة malloc () المشغل الجديد في C ++ حيث يتم استخدامه لتخصيص الذاكرة بشكل حيوي. و malloc () هي وظيفة مكتبة قياسية. يكون بناء جملة الدالة malloc () كما يلي:

 type variable_name = (type *) malloc (sizeof (type))؛ 

هنا ، يشير "type" إلى نوع البيانات للمتغير الذي يجب تخصيص الذاكرة له. إن variable_name هو اسم المتغير المرجعي الذي سيتم تعيين المؤشر إليه بواسطة malloc (). يصف (النوع *) نوع الكتابة للحصول على مؤشر إلى الذاكرة في نوع معين. يصف sizeof () malloc () ، أن حجم الذاكرة المطلوبة.

يتطلب malloc () صب نمط لأن المؤشر الذي يتم إرجاعه بواسطة malloc () هو من نوع void ، لذلك ، لتعيين نوع إلى المؤشر ، مطلوب كتابة الكتابة. مطلوب sizeof () لأن الدالة malloc () يخصص لذاكرة خام ، ومن المطلوب إخبار الدالة malloc () بأن حجم الذاكرة الذي يجب عليه تخصيصه. إذا كانت الذاكرة المخصصة غير كافية ، يمكن تغيير حجمها أو إعادة تخصيصها باستخدام realloc ().

يخصص الدالة malloc () الذاكرة على كومة الذاكرة المؤقتة. في هذه الحالة ، تكون الذاكرة المؤقتة خارج الذاكرة ثم ترجع الدالة malloc () مؤشر NULL. وبالتالي ، يجب التحقق من متغير المرجع الذي يحتوي على مؤشر تم إرجاعه بواسطة malloc () قبل استخدامه ، وإلا فقد ينتج عنه تعطل النظام.

يتم تخصيص الذاكرة المخصصة بواسطة الدالة malloc () باستخدام free (). كما يؤدي استدعاء دالة إلى حمل ، malloc () يتطلب المزيد من الوقت للتنفيذ.

الاختلافات الرئيسية بين new و malloc ()

  1. المشغل الجديد هو بناء قدم في C ++ ويستخدم في Java ، C # ، الخ. ومن ناحية أخرى malloc () هي وظيفة مكتبة قياسية موجودة فقط في لغة C وتدعمها C ++.
  2. يخصص المشغل الجديد ذاكرة كافية لكائن من نوع محدد لذلك ، لا يتطلب عامل تغيير الحجم. من ناحية أخرى ، تتطلب الدالة malloc () عامل التشغيل sizeof () السماح للدالة بمعرفة حجم الذاكرة المطلوب تخصيصه.
  3. يمكن للمشغل الجديد استدعاء مُنشئ الكائن أثناء التصريح. من ناحية أخرى ، لا يمكن استدعاء الدالة malloc () المنشئ.
  4. المشغل "الجديد" يمكن أن يكون محملاً بشكل زائد لكن malloc () لا يمكن.
  5. إذا فشل المشغل الجديد في تخصيص الذاكرة ، فإنه يلقي استثناءً يجب معالجته بواسطة الكود الآخر الذي سينتهي البرنامج. من ناحية أخرى ، ترجع الدالة malloc () مؤشر NULL إذا فشلت في تخصيص الذاكرة. إذا تم استخدام المؤشر دون التحقق من ذلك ، فسوف ينتج عنه تعطل النظام.
  6. يمكن تخصيص الذاكرة المخصصة باستخدام مشغل جديد باستخدام "delete". من ناحية أخرى ، يمكن تخصيص الذاكرة المخصصة باستخدام وظيفة malloc () باستخدام free ().
  7. بمجرد تخصيص الذاكرة باستخدام مشغل جديد ، لا يمكن تغيير حجمها في أي حال. من ناحية أخرى ، يمكن إعادة تخصيص الذاكرة المخصصة باستخدام الدالة malloc () (تغيير حجمها) باستخدام دالة realloc ().
  8. وقت التنفيذ الجديد أقل بالمقارنة مع malloc () لأن malloc هو وظيفة والجديد هو بناء.

استنتاج:

وظيفة malloc () هي الطريقة القديمة لتخصيص الذاكرة ديناميكياً. في الوقت الحاضر ، يتم استخدام المشغل الجديد لتخصيص الذاكرة في وقت التشغيل لأنه يحتوي على مزايا معينة أكثر من malloc ().

Top