الانتقال إلى المحتوى الرئيسي

كيف يتم تخصيص الذاكرة لمجموعة ديناميكية حررت?

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

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

من المهم أن تتذكر أنه عند استخدام عامل الحذف [] ، من الضروري حذف مصفوفة ، وليس مجرد عنصر واحد. خلاف ذلك ، قد يحدث تسرب للذاكرة.

يحرر عامل الحذف [] الذاكرة المخصصة للمصفوفة ويستدعي التدمير لجميع عناصر المصفوفة. المدمر هو وظيفة خاصة يتم استدعاؤها عند حذف كائن. إذا كانت المصفوفة تحتوي على كائنات من الفئات ، فسيتم استدعاء مدمرات هذه الكائنات عند تحرير الذاكرة. إذا كانت المصفوفة تحتوي على متغيرات بسيطة لا تتطلب تحرير الموارد ، فلن يتم استدعاء المدمرات.

  1. تخصيص الذاكرة لمجموعة ديناميكية
  2. تحديد المصفوفات الديناميكية
  3. مشاكل في جمع القمامة
  4. خوارزمية تحرير الذاكرة
  5. باستخدام عامل الحذف
  6. صفائف ديناميكية متعددة الأبعاد
  7. تحرير الذاكرة اليدوي
  8. ميزات تحرير الذاكرة لأنواع مختلفة من البيانات
  9. سؤال وجواب
  10. لماذا أحتاج إلى تحرير الذاكرة المخصصة لمجموعة ديناميكية?
  11. كيف يتم تخصيص الذاكرة لمجموعة ديناميكية تحرير?
  12. ماذا يحدث إذا لم يتم تحرير الذاكرة المخصصة لمجموعة ديناميكية?
  13. ماذا يحدث إذا كنت تستخدم عامل خاطئ لتحرير الذاكرة المخصصة لمجموعة ديناميكية?
  14. هل من الممكن لتحرير الذاكرة المخصصة لمجموعة ديناميكية دون استخدام المشغل حذف?

تخصيص الذاكرة لمجموعة ديناميكية

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

. يسمح لك بطلب كتلة ذاكرة بالحجم المطلوب من نظام التشغيل وإرجاع مؤشر إلى بداية هذه الكتلة.

يبدو مثل هذا:

نوع * مؤشر = نوع جديد [حجم];

النوع هو نوع بيانات عناصر المصفوفة ، على سبيل المثال ، كثافة العمليات ، التعويم ، الحرف ، إلخ.

المؤشر هو متغير يقوم بتخزين عنوان كتلة الذاكرة المخصصة.

الحجم هو عدد العناصر التي سيتم تخزينها في مصفوفة ديناميكية.

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

كثافة العمليات * آر = كثافة العمليات الجديدة[10];

في هذا المثال ، نطلب من نظام التشغيل كتلة ذاكرة كبيرة بما يكفي لتخزين 10 عناصر كثافة العمليات. سيقوم مؤشر آر بتخزين عنوان كتلة الذاكرة هذه.

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

:

حذف [] المؤشر;

مثال على تحرير الذاكرة من مجموعة أر:

يحذف [];

يجب أن يتم تحرير الذاكرة لتجنب تسرب الذاكرة وتعطل البرنامج.

وبالتالي ، فإن تخصيص الذاكرة لصفيف ديناميكي يسمح لك بإدارة الذاكرة بشكل فعال وتخزين عدد متغير من العناصر.

تحديد المصفوفات الديناميكية

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

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

. يمكن أيضا توفير القدرة على العمل مع المصفوفات الديناميكية من خلال الفئات المضمنة أو هياكل اللغة.

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

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

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

مشاكل في جمع القمامة

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

ومع ذلك ، هناك بعض القضايا المتعلقة بجمع القمامة:

  1. تخصيص وإطلاق الذاكرة

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

  2. روابط دورية

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

  3. روابط ميتة

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

  4. عدم القدرة على التنبؤ بوقت جمع القمامة

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

  5. مشاكل في التنفيذ المتوازي

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

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

خوارزمية تحرير الذاكرة

يمكن تحرير الذاكرة المخصصة لصفيف ديناميكي باستخدام خوارزمية تتكون من الخطوات التالية:

  1. تحديد حجم المصفوفة.
  2. عبور كل عنصر من عناصر المصفوفة وتحرير الذاكرة التي تشغلها العناصر.
  3. تحرير الذاكرة المخصصة للمصفوفة نفسها.

سننظر في خطوات الخوارزمية بالتفصيل أدناه.

  1. تحديد حجم المصفوفة:
نوع الذاكرةالوصف
ثابتيعرف حجم المصفوفة في وقت تجميع البرنامج ويتم تحرير الذاكرة تلقائيا عندما يكون المتغير خارج النطاق.
ديناميكيةيتم تحديد حجم المصفوفة ديناميكيا أثناء تنفيذ البرنامج ولا يتم تحرير الذاكرة تلقائيا.
  1. المرور عبر كل عنصر من عناصر المصفوفة وتحرير الذاكرة:

لكل عنصر من عناصر المصفوفة.

  1. تحرير الذاكرة المخصصة للمصفوفة نفسها:

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

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

باستخدام عامل الحذف

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

بناء جملة بيان الحذف:

حذف [] الاسم الجماعي;

لن يحرر بشكل صحيح كل الذاكرة المخصصة للمصفوفة.

بيان حذف ينفذ عمليتين: أولا ، يستدعي المدمر لكل عنصر من عناصر المصفوفة (إذا كان هناك عنصر واحد) ، ثم يحرر الذاكرة المخصصة لتخزين المصفوفة.

مثال على استخدام عامل الحذف:

كثافة العمليات * صفيف = كثافة العمليات الجديدة [5] ؛ / / تخصيص الذاكرة لمجموعة

// العمل مع صفيف

حذف [] صفيف ؛ / / تحرير الذاكرة عند الانتهاء من الصفيف باستخدام

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

صفائف ديناميكية متعددة الأبعاد

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

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

فيما يلي مثال على إنشاء مصفوفة ديناميكية ثنائية الأبعاد بحجم 3 في 3:

كثافة العمليات * * صفيف = كثافة العمليات الجديدة * [3] ؛ / / إنشاء مجموعة من المؤشرات إلى مؤشرات

إلى عن على (كثافة العمليات أنا = 0; أنا < 3; أنا i) {

صفيف [أنا] = كثافة العمليات الجديدة[3] ؛ / / إنشاء صفائف ديناميكية أحادية البعد

}

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

هنا مثال على تحرير الذاكرة لمجموعة ديناميكية ثنائية الأبعاد:

إلى عن على (كثافة العمليات أنا = 0; أنا < 3; أنا i) {

حذف [] صفيف [أنا] ؛ / / حذف المصفوفات الديناميكية أحادية البعد

}

حذف [] مجموعة ؛ / / حذف مجموعة من المؤشرات إلى مؤشرات

يمكن الحصول على قيم عناصر المصفوفة الديناميكية متعددة الأبعاد وتغييرها باستخدام قيمة فهرس مزدوجة. على سبيل المثال ، للحصول على قيمة عنصر صفيف مع الفهارس أنا و ي ، يمكنك استخدام التعبير التالي: صفيف[أنا][ي].

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

تحرير الذاكرة اليدوي

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

يتضمن الإصدار اليدوي للذاكرة الخطوات التالية:

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

مثال على إصدار الذاكرة اليدوي في ج:

  1. إنت * أرر = مالوك (ن * سيزوف( إنت));
  2. // باستخدام صفيف
  3. مجانا;
  4. أر = لاغية;

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

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

ميزات تحرير الذاكرة لأنواع مختلفة من البيانات

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

1. تحرير الذاكرة لأنواع البيانات البسيطة:

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

2. تحرير الذاكرة لمصفوفات من أنواع البيانات البسيطة:

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

كثافة العمليات * آر = كثافة العمليات الجديدة[10];

يحذف [];

3. تحرير الذاكرة لكائنات الفئة:

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

فئة ميكلاس {

العامة:

// المنشئ والمدمر

ميكلاس () { }

~ ميكلاس () { }

// ...

};

ميكلاس * أوبج = جديد ميكلاس ();

حذف الكائن;

4. تحرير الذاكرة للسلاسل:

لبيانات سلسلة مثل شار* ، الأمراض المنقولة جنسيا:: سلسلة ، يتم تخصيص الذاكرة وتحريرها بطرق مختلفة:

      // تحرير الذاكرة لكل فئة فرعية

      ل (إنت أنا = 0 ؛ أنا < ن ؛ i أنا) {

      يحذف [];

      }