سؤال

لذلك لدي مؤشر لمجموعة من المؤشرات.إذا قمت بحذفه هكذا:

delete [] PointerToPointers;

هل سيؤدي ذلك إلى حذف جميع المؤشرات المشار إليها أيضًا؟إذا لم يكن الأمر كذلك، فهل يجب علي تكرار كل المؤشرات وحذفها أيضًا، أم أن هناك طريقة أسهل للقيام بذلك؟يبدو أن Google-fu الخاص بي لا يقدم لي أي إجابات جيدة على هذا السؤال.

(ونعم، أعلم أنني بحاجة إلى استخدام ناقل.هذه واحدة من تلك المهام من النوع "C++" في المدرسة.)

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

المحلول

نعم، يجب عليك تكرار المؤشرات وحذفها بشكل فردي.

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

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

نصائح أخرى

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

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

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

  delete pI;
  delete [] pArr;

تقوم عبارات الحذف هذه بمسح الذاكرة التي تم تخصيصها بواسطة العبارات "الجديدة".

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

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

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

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

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

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

  delete [] ppArr;

  return 0;

}

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

يرى تعزيز حاوية المؤشر لحاوية تقوم بالحذف التلقائي للمؤشرات المضمنة نيابةً عنك، مع الحفاظ على بناء جملة قريب جدًا من حاويات STL العادية.

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

لنأخذ مثالاً حقيقيًا (مشفرة زائفة). تخيل أن لديك فصلًا دراسيًا مثل هذا:

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

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

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

إذا قمت بحذف [] مصفوفة المؤشرات، فكل ما فعلته هو حذف مصفوفة من الأعداد الصحيحة.

أعتقد أنك سوف تضطر إلى تكرار ما أخشى.

لا أعرف لماذا تم الرد على هذا الأمر بشكل مربك لفترة طويلة.

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

لقد قمت بحذف مجموعة من العناوين، ولكن لم يتم حذف أي كائنات.

لا يهتم Delete بمحتوى مساحة الذاكرة ، فهو يطلق على المدمار (S) ويمثل MEM على أنه مجاني.

لا يهتم أنه حذف مجموعة من الكائنات ، فهي ترى فقط.

لهذا السبب عليك التنقل عبر المصفوفة أولاً!واتصل حذف على كل عنصر ، ثم يمكنك حذف تخزين الصفيف نفسه.

حسنآ الان لي الإجابة كانت طويلة بعض الشيء......غريب...;)

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

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