بالطبع، دعنا نلقي نظرة على الشفرة المقدمة ونفهم ما يحدث في كل خطوة.
أولاً، في السطر الأول، نقوم بتعريف متغير من نوع int يسمى “a” ونعطيه القيمة 10.
-
توجيه سجلات Docker Compose إلى syslog29/01/2024
-
فهم نتائج كود جافا: لماذا 6 وليس 4؟31/01/2024
ثم، في السطر الثاني، نعرف مؤشرًا إلى int يسمى “b” ونضع فيه عنوان متغير “a” باستخدام عامل العنوان (&).
في السطر الثالث، نعرف مؤشر آخر إلى int يسمى “c” ونجعله يشير إلى نفس المكان الذي يشير إليه “b”.
الآن، في السطر الرابع، نستخدم الأمر “delete” لتحرير الذاكرة التي تحتوي عليها المؤشر “b”. وهنا يكمن الخطأ.
عند استخدام “delete”، يجب أن نكون متأكدين من أننا نحرر الذاكرة التي تم تخصيصها باستخدام “new”. في هذه الحالة، لم نستخدم “new” لتخصيص أي ذاكرة. بل قمنا فقط بتعريف متغير int عادي.
بمعنى آخر، نحن لا نحتاج إلى استخدام “delete” في هذه الحالة، ولن يكون له أي تأثير. ولكنه لن يؤدي إلى عدم إمكانية الوصول إلى المتغير “a”، لأنه لم يتم تخصيصه باستخدام “new”.
لذا، بالنسبة لسؤالك، نعم، “delete b” و “delete c” هما متطابقتان في هذه الحالة ولا تؤديان إلى تحرير الذاكرة أو جعل المتغير “a” غير قابل للوصول.
المزيد من المعلومات
بمجرد فهمنا أن استخدام “delete” في هذه الحالة لا يؤدي إلى تحرير الذاكرة أو جعل المتغير “a” غير قابل للوصول، يمكننا النظر في كيفية التعامل مع الذاكرة وتحريرها بشكل صحيح في C++.
عادةً ما يتم استخدام “delete” في C++ لتحرير الذاكرة التي تم تخصيصها باستخدام “new”. على سبيل المثال:
cppint* ptr = new int; // allocate memory for an integer
// use ptr...
delete ptr; // release the memory when done
في هذا المثال، تم تخصيص ذاكرة جديدة باستخدام “new”، وبالتالي يجب علينا استخدام “delete” لتحرير هذه الذاكرة بعد الانتهاء من استخدامها.
ومن المهم أيضًا أن نتذكر أنه عند تحرير الذاكرة باستخدام “delete”، يجب علينا أن نتأكد من عدم استخدام المؤشر بعد ذلك، لأنه سيشير إلى منطقة ذاكرة لم يعد مخصصًا له.
في حالتك، حيث لم يتم استخدام “new” لتخصيص الذاكرة، لا يجب استخدام “delete” على المؤشرات “b” أو “c”، ولن يؤدي استخدامها إلى أي تأثير على المتغير “a”.
لذا، للحفاظ على سلامة التطبيقات وتجنب تسريب الذاكرة أو حدوث أخطاء أخرى، يجب علينا فقط استخدام “delete” عندما نكون متأكدين من أن الذاكرة التي نحن نحررها هي التي تم تخصيصها بواسطة “new”.