في لغة C، تعد إرجاع سلسلة C حرفيًا من دالة std::string بمثابة ممارسة غير حكيمة يمكن أن تؤدي إلى سلوك غير محدد. ومع ذلك، هناك مفهوم خاطئ شائع مفاده أن هذا الرمز يجب أن يفشل، بينما يبدو أنه يعمل في بعض الحالات.
عندما تكون "هذا أنا!!" تم تمريره إلى myFunction()، ويتم تحويل حرفية السلسلة C ضمنيًا إلى كائن std::string. يشير كائن std::string الذي تم إرجاعه إلى مخزن الأحرف الداخلي الخاص به، والذي يحتوي على نسخة من السلسلة الحرفية. يؤدي استدعاء c_str() على std::string إلى إرجاع مؤشر إلى هذا المخزن المؤقت.
تنشأ المشكلة المحتملة لأن المخزن المؤقت للأحرف الداخلية لكائن std::string غير مخزن في الذاكرة الثابتة. بمجرد إرجاع الدالة myFunction()، سيتم تدمير الكائن std::string والمخزن المؤقت الداخلي الخاص به. هذا يعني أن المؤشر الذي تم الحصول عليه من c_str() يصبح مؤشرًا متدليًا يشير إلى الذاكرة التي تم إلغاء تخصيصها.
ومع ذلك، في بعض التطبيقات وظروف معينة، قد لا يستعيد نظام التشغيل على الفور الذاكرة المستخدمة بواسطة std::string التي تم إلغاء تخصيصها . وهذا ما يُعرف باسم ثبات الذاكرة. ونتيجة لذلك، يسمح نظام التشغيل عن طريق الخطأ للتعليمة البرمجية بمواصلة الوصول إلى الذاكرة غير المخصصة، مما يعطي الوهم بأن التعليمات البرمجية تعمل بشكل صحيح.
من المهم التأكيد على أن هذا السلوك غير محدد في لغة C. لا يحدد معيار اللغة ما يحدث في هذه الحالة، وقد تتصرف التطبيقات المختلفة بشكل مختلف. يعد الاعتماد على ثبات الذاكرة أمرًا خطيرًا ويمكن أن يؤدي إلى أخطاء غير متوقعة في سياقات مختلفة أو على أنظمة تشغيل مختلفة.
لذلك، في حين أن رمز المثال قد يبدو أنه يعمل في بعض الحالات، فإنه لا يزال يعتبر سلوكًا غير محدد ويجب أن يكون تم تجنبه. لمنع مثل هذه المشكلات، يوصى بإرجاع نسخة من السلسلة الحرفية من الدالة std::string بدلاً من مؤشر مباشر إلى المخزن المؤقت الداخلي الخاص بها.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3