Avatar ·

هل يمكن الوصول إلى ذاكرة متغير محلي خارج نطاقه؟

مرحبًا أيها الزملاء! لقد بدأت مؤخرًا في تعلم لغة C++ وواجهت سلوكًا غير مفهوم. كتبت دالة بسيطة تُرجع مؤشرًا إلى متغير محلي: ```cpp int* getPointer() { int localVar = 42; return &localVar; } int main() { int* ptr = getPointer(); std::cout << *ptr << std::endl; // يطبع 42... أحيانًا // ثم أحاول استخدامه مرة أخرى std::cout << *ptr << std::endl; // يطبع بيانات غير صالحة أو يتعطل } ``` اعتقدت أنه بعد الخروج من الدالة `getPointer()` يتم تدمير المتغير `localVar` ويصبح المؤشر معلقًا (dangling pointer). لكن في الممارسة العملية، أول طباعة غالبًا ما تُظهر القيمة الصحيحة 42. لماذا يحدث هذا؟ هل هو سلوك غير محدد (undefined behavior) أم هناك تفسير؟ ما يربكني هو أن البرنامج يعمل أحيانًا "بشكل طبيعي" وأحيانًا يتعطل. قرأت أن ذاكرة المكدس لا تُمسح فورًا، لكن هذا لا يعني أنه يمكن استخدامها، أليس كذلك؟ أم أنني أخلط الأمور؟ أرجو توضيح كيفية فهم عمر المتغير بشكل صحيح.