سؤال

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

ولكن عندما نحرر مجموعة مخصصة ديناميكيا، لا نحدد الحجم، بدلا من ذلك، نحن فقط "PTR مجانا" أو "حذف [] PTR". كيف يمكن مجانا أو حذف يعرف حجم الصفيف؟ هل يمكننا استخدام نفس المخطط لتجنب تخزين حجم الصفيف في متغير آخر؟

شكرا!

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

المحلول

نعم هذا صحيح.

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

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


على سبيل المثال، في نموذج مخصص الذاكرة الموضح في K & R2، هذا هو "رأس" وضعت قبل كل قطعة مخصصة:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size هو حجم الكتلة المخصصة (التي تستخدمها بعد ذلك free, ، أو delete).

نصائح أخرى

الشيء المضحك هو أنه تاريخيا كان delete [20] arr; تماما كما هو arr = new int[20]. وبعد ومع ذلك، أثبتت ممارسة أن المعلومات المتعلقة بالحجم يمكن تخزينها بشكل مؤلم من قبل المخصص، وبما أن معظم الناس يستخدمونها ثم تخزينها على أي حال، فقد تمت إضافته إلى المعيار.

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

int* arr = new int[20];
delete [20] arr;

الجزء المحزن حول هذا كله هو أنه لا يوجد طريقة مطابقة قياسية لاسترداد حجم الاستخدام الخاص بك: - /

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

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

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