c++ - لماذا الأمراض المنقولة جنسيا:: تبدأ و الأمراض المنقولة جنسيا:: نهاية "ليست آمنة الذاكرة"؟




c++11 iterator (4)

أعتقد أن نقطة إريك حول std::begin هي أنه يقبل بصمت حاوية rvalue كحجة لتبدأ. في ظاهر الأمر ، يتم توضيح مشكلة الكود أيضًا في

auto it = get_data().begin();

لكن std::begin start هو قالب وظيفة حرة ، ويمكن إجراؤه لرفض القيم دون الحاجة إلى إضافة مؤهلات المرجع المناسبة إلى أعضاء begin كل حاوية. من خلال إعادة التوجيه "فقط" ، فإنه يفوت فرصة لإضافة طبقة من أمان الذاكرة إلى التعليمات البرمجية.

من الناحية المثالية ، يمكن أن تستفيد مجموعة التحميل الزائد من إضافة

template< class C > 
void begin( C&& ) = delete;

قد يؤدي ذلك إلى جعل الشفرة في منشور المدونة غير قابلة للرفض في الحال.

في منشور المدونة هذا ، صرح إريك نيبلر بما يلي:

ما هو الخطأ في الأمراض المنقولة جنسيا :: تبدأ و الأمراض المنقولة جنسيا :: النهاية؟ مفاجأة! فهي ليست آمنة الذاكرة. النظر في ما يفعل هذا الرمز:

extern std::vector<int> get_data();
auto it = std::begin(get_data());
int i = *it; // BOOM

الأمراض المنقولة جنسيا :: تبدأ واثنين من الأحمال الزائدة للقيم const والقيم غير const. تكمن المشكلة في أن القيم المرتبطة ترتبط بمرجع القيم الثابتة ، مما يؤدي إلى تكرارها أعلاه.

أواجه مشكلة في فهم وجهة نظره ولماذا هي إشارة متدلية. يمكن أن يفسر شخص ما؟


الموجه المؤقت الذي تم إرجاعه بواسطة get_data يخرج عن نطاقه بعد انتهاء std::begin get_data . لا يتم الاحتفاظ به على قيد الحياة ، لذلك هو مكرر في كائن مدمر.


في الواقع ، يمكن تبسيط وظيفة معقدة لاثنين من وظائف قصيرة ، مثل

int& foo(int x){
   return x;
}
int generate_a_int(){
   return 42;
}

ثم استدعاءها foo (gener_a_int ()) ، يتم إنشاء قيمة مؤقتة ، بمجرد الخروج من نص الدالة ، يتم إتلاف القيمة المؤقتة التي تم إنشاؤها بواسطة gener_a_int () ، ومن ثم حدث مرجع التعلق ...

هل فهمت الان؟


لأنه يسمح التهيئة من قيمة rvalue ، وهو أمر سيء.







std