لماذا يمكن أن يكون حذف مصفوفة من الكائنات المشتقة عبر المؤشر الأساسي غير محدد
في لغة C، يكون سلوك حذف المصفوفة غير محدد إذا يختلف النوع الديناميكي للكائن عن نوعه الثابت. تم توضيح ذلك في معيار C 03 (5.3.5 [expr.delete] p3): "في البديل الثاني (مصفوفة الحذف)، إذا كان النوع الديناميكي للكائن المراد حذفه يختلف عن نوعه الثابت، يكون السلوك غير محدد ."
للتوضيح، ضع في اعتبارك مقتطف التعليمات البرمجية التالي:
struct B { virtual ~B() {} };
struct D : B {};
B* p = new D[20];
delete[] p; // undefined behavior
على الرغم من أنه قد يبدو من البديهي حذف مصفوفة من الكائنات المشتقة باستخدام مؤشر أساسي، إلا أن المعيار يحدد هذا على أنه سلوك غير محدد. وذلك لأن المؤشر الأساسي p يشير إلى الكائن الفرعي الأساسي للعنصر الأول في المصفوفة، بدلاً من العنصر الأول نفسه.
قد يتطلب تنفيذ الحذف متعدد الأشكال للمصفوفات استرداد نوع العنصر، وإجراء تحويل ديناميكي، ثم قم بإجراء حذف عادي[]. ومع ذلك، فإن هذا من شأنه أن يؤدي إلى حمل غير ضروري حتى عندما لا يتم استخدام تعدد الأشكال.
لذلك، لتجنب السلوك غير المحدد والحمل غير الضروري، من المهم أن تتذكر أن المصفوفات لا يمكن أن تتصرف بشكل متعدد الأشكال. بدلاً من ذلك، إذا كان السلوك متعدد الأشكال مرغوبًا، فيمكن تنفيذه بشكل منفصل.
لا تدعم المصفوفات السلوك متعدد الأشكال لتجنب معاقبة الاستخدامات المشروعة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3