"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تعمل `c_str()` على `std::string` غير مخصصة في هذه الحالة؟

لماذا تعمل `c_str()` على `std::string` غير مخصصة في هذه الحالة؟

تم النشر بتاريخ 2024-11-11
تصفح:509

 Why Does `c_str()` Work on a Deallocated `std::string` in This Case?

فهم الإرجاع الضمني في دالة C

في لغة C، عند تمرير سلسلة حرفية إلى دالة، يقوم المترجم بتحويلها ضمنيًا إلى دالة. std::كائن سلسلة. ومع ذلك، في المثال التالي، نعيد سلسلة حرفية على النمط C من std::string function:

std::string myFunction() {
    return "it's me!!";
}

هذا يثير القلق لأن مُنشئ std::string الذي يتم استدعاؤه ضمنيًا هنا ينشئ نسخة من السلسلة الحرفية. عندما تعود الدالة، يجب إلغاء تخصيص هذه النسخة، مع ترك مؤشر متدلي.

ماذا يحدث عندما تتصل بـ c_str()؟

ومع ذلك، استدعاء myFunction(). يقوم c_str() بإرجاع مؤشر إلى البيانات المخزنة في كائن std::string. يشير هذا المؤشر إلى نفس الذاكرة التي احتفظت بالسلسلة بشكل حرفي، حتى بعد إلغاء تخصيص كائن std::string. يرجع سبب نجاح هذا الرمز إلى وجود خلل في إدارة ذاكرة نظام التشغيل. عند إلغاء تخصيص كتلة الذاكرة، لا يقوم نظام التشغيل دائمًا بمسح محتوياتها. وهذا يعني أن بيانات السلسلة الحرفية لا تزال موجودة في الذاكرة، على الرغم من أنه لا يمكن الوصول إليها من الناحية الفنية.

سلوك غير محدد وحظ

من المهم ملاحظة أن هذا السلوك غير محدد وفقا لمعيار C. وهذا يعني أن أي شيء يمكن أن يحدث، بما في ذلك الأعطال أو النتائج غير الصحيحة. إنه يعمل في بعض الحالات ليس بسبب ممارسات C الصحيحة، ولكن بسبب تفاصيل تنفيذ نظام التشغيل.

&&&]لذلك، من الضروري تجنب الاعتماد على هذا السلوك والتأكد دائمًا من تخصيص البيانات وإلغاء تخصيصها بشكل صحيح في كود C الخاص بك. .

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3