كيف تعمل مع تخصيص الذاكرة الديناميكي C ++؟



تستكشف هذه المقالة تخصيص الذاكرة الديناميكية في C ++ وهي ميزة مهمة تتيح لك مراعاة احتياجات الذاكرة الخاصة بك لموارد الوقت الفعلي.

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

لذلك دعونا نبدأ بهذه المقالة حول تخصيص الذاكرة الديناميكية في C ++





هل تحتاج إلى تخصيص ذاكرة ديناميكية؟

لنفترض أننا نريد إدخال جملة كمصفوفة من الأحرف لكننا لسنا متأكدين من العدد الدقيق للأحرف المطلوبة في المصفوفة.

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



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

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

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



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

الاختلافات بين تخصيص الذاكرة الثابتة وتخصيص الذاكرة الديناميكي:

طريقة التحميل الزائد وطريقة التجاوز في جافا

هذه هي بنية الذاكرة الأساسية المستخدمة لأي برنامج C ++:

الذاكرة - تخصيص الذاكرة الديناميكية - Edureka

سنحتاج صورة كهذه

يتم استخدام المكدس لتخصيص الذاكرة الثابتة و Heap لتخصيص الذاكرة الديناميكية ، وكلاهما يتم تخزينهما في ذاكرة الوصول العشوائي للكمبيوتر.

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

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

المضي قدمًا في هذه المقالة حول تخصيص الذاكرة الديناميكي في C ++

تخصيص الذاكرة باستخدام جديد الكلمة الرئيسية

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

بناء الجملة:

نوع البيانات * pointer_name = نوع بيانات جديد

مثال:

int * ptr = new int // يمكننا الإعلان عن متغير أثناء التخصيص الديناميكي بالطريقتين التاليتين. int * ptr = new int (10) int * ptr = new int {15} // يُستخدم عامل التشغيل الجديد أيضًا لتخصيص كتلة (مصفوفة) من الذاكرة من نوع البيانات. int * ptr = new int [20] // البيان أعلاه يخصص الذاكرة ديناميكيًا لـ 20 عددًا صحيحًا بشكل مستمر من النوع int ويعيد المؤشر إلى العنصر الأول من التسلسل إلى مؤشر 'ptr'

ملحوظة : إذا كانت الكومة لا تحتوي على ذاكرة كافية لتخصيصها ، فإن الطلب الجديد يشير إلى الفشل بإلقاء استثناء std :: bad_alloc ، ما لم يتم استخدام 'nothrow' مع عامل التشغيل الجديد ، وفي هذه الحالة يقوم بإرجاع مؤشر NULL. لذلك ، من الجيد التحقق من متغير المؤشر الذي تم إنتاجه بواسطة new قبل استخدامه في البرنامج.

المضي قدمًا في هذه المقالة حول تخصيص الذاكرة الديناميكي في C ++

إلغاء تخصيص الذاكرة باستخدام ملفات حذف الكلمة الرئيسية:

بمجرد تخصيص ذاكرة الكومة لمتغير أو كائن فئة باستخدام جديد الكلمة الأساسية ، يمكننا إلغاء تخصيص مساحة الذاكرة هذه باستخدام حذف كلمة رئيسية.

بناء الجملة:

المحور و unpivot في SQL
حذف pointer_variable // هنا ، pointer_variable هو المؤشر الذي يشير إلى كائن البيانات الذي تم إنشاؤه بواسطة new. حذف [] pointer_variable // لتحرير ذاكرة المصفوفة المخصصة ديناميكيًا والمشار إليها بواسطة متغير المؤشر ، نستخدم الشكل التالي للحذف:

مثال:

حذف ptr حذف [] ptr

ملحوظة : مدى الكائن أو عمر الكائن هو الوقت الذي يظل فيه الكائن في الذاكرة أثناء تنفيذ البرنامج. يعد تخصيص ذاكرة الكومة أبطأ من المكدس ، لأنه ، في الكومة ، لا يوجد ترتيب معين يمكنك من خلاله تخصيص الذاكرة بينما في المكدس يتبع LIFO.

المضي قدمًا في هذه المقالة حول تخصيص الذاكرة الديناميكي في C ++

التخصيص الديناميكي للصفائف

الاستخدام الرئيسي لمفهوم تخصيص الذاكرة الديناميكي هو تخصيص الذاكرة لمصفوفة عندما يتعين علينا الإعلان عنها من خلال تحديد حجمها ولكننا غير متأكدين من ذلك.

دعونا نرى ، مثال لفهم كيفية استخدامها.

# تضمين باستخدام مساحة الاسم std int main () {int len، sum = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = new int [len] // ديناميكيًا لتخصيص الذاكرة<< 'Enter the marks of each student' << endl for( int i = 0 i>* (علامات + i)} لـ (int i = 0 i

تفسير:
في هذا المثال ، نسأل المستخدم أولاً عن عدد الطلاب في الفصل ونقوم بتخزين قيمته في متغير len. ثم نعلن عن مصفوفة من الأعداد الصحيحة ونخصصها في الذاكرة مساوية ديناميكيًا للقيمة المخزنة في متغير len باستخدام هذه العبارة int * العلامات = new int [length] وبالتالي يتم تخصيص مساحة تساوي 'length * (حجم 1 عدد صحيح)'. ما تبقى من الكود لا يحتاج إلى شرح.

المضي قدمًا في هذه المقالة حول تخصيص الذاكرة الديناميكي في C ++

تخصيص الذاكرة الديناميكي للكائنات

يمكننا أيضًا تخصيص الكائنات ديناميكيًا.

كما نعلم أن المُنشئ وظيفة عضو في فئة خاصة تُستخدم لتهيئة كائن وأن Destructor هي أيضًا وظيفة عضو في الفئة تُسمى كلما خرج الكائن عن النطاق.

يمكن استخدام المدمر لتحرير الذاكرة المخصصة للكائن. يتم استدعاؤه في الحالات التالية.

  • عندما يخرج كائن محلي عن النطاق
  • بالنسبة للكائن العام ، عند تطبيق عامل على مؤشر إلى كائن من الفئة

يمكننا مرة أخرى استخدام المؤشرات أثناء تخصيص الذاكرة ديناميكيًا للكائنات.

دعونا نرى مثالا على مجموعة من الكائنات.

#include using namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

انتاج:

تفسير:

سيتم استدعاء المُنشئ ثلاث مرات نظرًا لأننا نخصص الذاكرة لثلاثة كائنات من الفئة Random. سيتم أيضًا استدعاء المدمر ثلاث مرات خلال كل من هذه الكائنات. 'Random * a = new Random [3]' هذا البيان مسؤول عن تخصيص الذاكرة الديناميكي للكائن.

وهكذا وصلنا إلى نهاية هذه المقالة حول 'تخصيص الذاكرة الديناميكية C ++'. إذا كنت ترغب في معرفة المزيد ، تحقق من بواسطة Edureka ، شركة تعليمية موثوقة عبر الإنترنت. تم تصميم دورة تدريب وإصدار شهادات Java J2EE و SOA من Edureka لتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في هذه المدونة وسنعاود الاتصال بك في أقرب وقت ممكن.