سؤال

نسخة مكررة من: في أي الحالات يمكنني استخدام malloc مقابل الجديد؟

فقط أعد قراءة هذا السؤال:
ما الفرق بين "جديد" و"malloc" و"calloc" في لغة C++؟

راجعت الإجابات ولكن لم يجب أحد على السؤال:

  • متى يمكنني استخدام malloc بدلا من الجديد؟

هناك عدة أسباب (أستطيع أن أفكر في اثنين).
دع الأفضل يطفو إلى الأعلى.

هل كانت مفيدة؟

المحلول

زوجان يتبادران إلى ذهني:

  • عندما تحتاج إلى رمز ليكون محمولاً بين C++ وC.
  • عندما تقوم بتخصيص الذاكرة في مكتبة يمكن استدعاؤها من لغة C، ويجب على رمز C تحرير التخصيص.

نصائح أخرى

من الأسئلة الشائعة حول Stroustrup على new/malloc كتبت في ذلك الموضوع :

عندما تستخدم malloc() يجب أن تفكر في تهيئة مؤشر الإرجاع وتحويله إلى نوع مناسب.سيتعين عليك أيضًا التفكير فيما إذا كنت قد حصلت على عدد البايتات المناسب لاستخدامك.لا يوجد فرق في الأداء بين malloc() والجديد عندما تأخذ التهيئة في الاعتبار.

وهذا ينبغي أن أجيب على سؤالك.

أفضل سبب يمكنني التفكير فيه لاستخدام malloc في C++ هو عند التفاعل مع واجهة برمجة تطبيقات C خالصة.تمتلك بعض واجهات برمجة تطبيقات C التي عملت معها ملكية ذاكرة معلمات معينة.على هذا النحو، فهم مسؤولون عن تحرير الذاكرة وبالتالي يجب أن تكون الذاكرة قابلة للتحرير عبر الحرة.سيعمل مالوك في هذه اللعبة ولكن ليس بالضرورة جديدًا.

في لغة C++، لا يحدث ذلك أبدًا.new عادةً ما يكون عبارة عن غلاف حول malloc يستدعي المُنشئين (إن أمكن).

ومع ذلك، على الأقل مع Visual C++ 2005 أو أفضل منه، يمكن أن يؤدي استخدام malloc في الواقع إلى ثغرات أمنية أكثر من الجديد.

خذ بعين الاعتبار هذا الرمز:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

أنها تبدو متساوية.ومع ذلك، فإن الكودجن الخاص بالأول يتحقق فعليًا من وجود تجاوز لعدد صحيح count * sizeof(MyStruct). إذا جاء العدد من مصدر غير موثوق به، فقد يتسبب ذلك في تجاوز عدد صحيح مما يؤدي إلى تخصيص كمية صغيرة من الذاكرة، ولكن عند استخدام العد، فإنك تتجاوز المخزن المؤقت.

لقد ذكر الجميع (باستخدام كلمات مختلفة قليلاً) عند استخدام مكتبة C التي ستستخدم free() وهناك الكثير من تلك المكتبة.

والحالة الأخرى التي أراها هي:

عند التعامل مع إدارة الذاكرة الخاصة بك (لأنك لسبب ما اكتشفت من خلال النمذجة، فإن الوضع الافتراضي ليس جيدًا بما فيه الكفاية).يمكنك تخصيص كتلة الذاكرة باستخدام malloc وتهيئة الكائنات داخل المجمعات باستخدام الموضع الجديد.

أحد الأسباب هو أنه في لغة C++، يمكنك زيادة تحميل العامل الجديد.

إذا أردت التأكد من استخدام تخصيص ذاكرة مكتبة النظام في التعليمات البرمجية الخاصة بك، فيمكنك استخدام malloc.

نادرًا ما يحتاج مبرمج C++ إلى الاتصال بـ malloc.السبب الوحيد للقيام بذلك الذي يمكنني التفكير فيه هو واجهة برمجة التطبيقات (API) سيئة الإنشاء والتي تتوقع منك المرور في ذاكرة malloc'd لأنها ستكون مجانية.في الكود الخاص بك، new يجب أن يكون دائمًا مساويًا لـ malloc.

إذا كان سيتم تحرير الذاكرة بواسطة free() (في الكود الخاص بك أو في كود شخص آخر)، فمن الضروري جدًا استخدام malloc.

خلاف ذلك لست متأكدا.إحدى الحالات المفتعلة هي عندما لا تريد تشغيل المدمر (المدمرات) عند الخروج، ولكن في هذه الحالة من المحتمل أن يكون لديك كائنات لا تحتوي على dtor no-op على أي حال.

يمكنك استخدام malloc عندما لا ترغب في القلق بشأن التقاط الاستثناءات (أو استخدام إصدار جديد غير قابل للرمي).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top