البرمجة

تحذير: مشاكل في تحرير الذاكرة في لغة C++

في لغة البرمجة C، يشير الرمز ‘*’ إلى الرمز “استدعاء القيمة المخزنة في العنوان”، بينما يشير الرمز ‘&’ إلى “عنوان الذاكرة” للمتغير. عندما تقول المدرسة “a1 = a2″، فإنها في الواقع تقوم بتعيين قيمة المؤشر a1 لتكون نفس قيمة المؤشر a2.

في السياق الذي قدمته:

c
int *a1; int *a2 = new int[100]; a1 = a2; // تعيين قيمة a2 إلى a1 delete[] a2; k = a1[0]; // هنا يحدث الخطأ الذي أشارت المدرسة إليه

تم تخصيص مساحة في الذاكرة باستخدام new int[100] لمؤشر a2. ثم قامت المدرسة بتعيين قيمة a2 إلى a1. يبدو أن هناك خطأ في الكود، حيث أن a1 و a2 هما مؤشرين إلى نفس المكان في الذاكرة، ولكن بعد حذف a2 باستخدام delete[]، سيصبح a1 يشير إلى منطقة غير صالحة في الذاكرة.

عندما تحاول الوصول إلى a1[0] بعد حذف a2، ستحدث أخطاء في الذاكرة لأن a1 يشير إلى مكان تم حذفه بالفعل. هذا يعتبر استخدام مؤشر بعد حذف المكان الذي يشير إليه، مما يؤدي إلى سلوك غير معرف وأخطاء في التنفيذ.

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

المزيد من المعلومات

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

المؤشرات في لغة C++:

المؤشرات هي متغيرات تخزن عناوين الذاكرة، وهي تسمح للمبرمج بالوصول المباشر إلى المكان في الذاكرة حيث يتم تخزين البيانات. في المثال الذي قدمته، لدينا مؤشرين a1 و a2 من نوع int*، وهما يحتويان على عناوين الذاكرة.

السطر a1 = a2:

عند كتابة a1 = a2، يتم نسخ عنوان الذاكرة الذي يحمله a2 إلى a1. وبهذا، يصبح لدينا مؤشرين يشيران إلى نفس المكان في الذاكرة، مما يؤدي إلى مشكلة في حالة حدوث تحرير الذاكرة.

السطر delete[] a2:

تُستخدم delete[] لتحرير الذاكرة التي تم تخصيصها باستخدام new أو new[]. في هذا السياق، تم حذف المساحة التي تم تخصيصها ل a2 باستخدام new int[100]. وهنا تكمن المشكلة، حيث أن a1 الآن يشير إلى منطقة في الذاكرة تم حذفها.

السطر k = a1[0]:

بعد حذف a2، a1 يشير إلى منطقة غير صالحة في الذاكرة، لذا عند محاولة الوصول إلى a1[0]، يحدث خطأ. تحاول البرنامج الوصول إلى قيمة في منطقة غير مخصصة، مما يؤدي إلى سلوك غير معرف وقد يتسبب في تحطم البرنامج.

التوجيه لتصحيح الكود:

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

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!