C++ Academy · درس

المشكلات ودورات الحياة

تجنّب العروض المتدلية

الدرس 3 من 413 خطوة

المشكلات ودورات الحياة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

العروض لا تملك البيانات

يشير string_view فقط إلى محارف تملكها جهة أخرى. فإذا اختفى ذلك التخزين، يصبح العرض معلّقًا، ويؤدي الوصول إليه إلى سلوك غير معرّف.

العرض المعلّق الناتج عن كائن مؤقت

يُعد ربط عرض بـ std::string مؤقتة أمرًا خطيرًا: إذ ينتهي عمر الكائن المؤقت في نهاية العبارة، فيبقى العرض مشيرًا إلى ذاكرة محررة.

#include <string>
#include <string_view>
std::string make() { return "temp"; }
int main() {
    std::string_view sv = make(); // dangles immediately
    // using sv here is undefined behavior
    (void)sv;
}

إرجاع عرض إلى متغير محلي

لا تُرجعوا مطلقًا عرضًا يشير إلى داخل سلسلة محلية؛ إذ تُدمَّر السلسلة المحلية عند عودة الدالة.

#include <string>
#include <string_view>
std::string_view bad() {
    std::string local = "oops";
    return local; // local dies, view dangles
}
int main() { (void)bad(); }

آمن: عرض لسلسلة موجودة

يكون العرض آمنًا ما دام المصدر يبقى موجودًا مدةً أطول منه. في هذه الحالة، تبقى السلسلة موجودة طوال مدة الدالة.

#include <iostream>
#include <string>
#include <string_view>
int main() {
    std::string s = "alive";
    std::string_view sv = s;
    std::cout << sv << "\n"; // safe
}

غير منتهٍ بمحرف صفري

لا يُضمن أن تنتهي بيانات العرض بـ \0. وقد يؤدي تمرير sv.data() إلى دالة C تتوقع سلسلة C إلى القراءة بعد نهاية البيانات.

استخدموا size()، لا strlen

اعتمدوا دائمًا على sv.size() لمعرفة الطول بدلًا من دوال سلاسل C، لأن العرض قد يكون شريحةً من مخزن مؤقت أكبر.

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = std::string_view("hello world").substr(0, 5);
    std::cout << sv.size() << "\n"; // 5, not 11
}

تعديل المصدر

إذا أُعيد تخصيص السلسلة الأساسية، مثلًا بسبب زيادة سعتها عبر push_back، تصبح العروض الموجودة التي تشير إليها غير صالحة.

تخزين العروض في أعضاء الفئة

كونوا حذرين عند تخزين string_view كعضو في فئة؛ إذ يجب أن تضمنوا بقاء البيانات المشار إليها مدةً أطول من الكائن. وعند الشك، خزّنوا std::string بدلًا منه.

المعاملات آمنة عادةً

يُعد استخدام string_view باعتباره معامل دالة الحالة الآمنة والمألوفة؛ إذ يبقى الوسيط موجودًا طوال مدة الاستدعاء.

#include <iostream>
#include <string_view>
size_t len(std::string_view sv) { return sv.size(); }
int main() {
    std::cout << len("temporary is fine here") << "\n";
}

انسخوا البيانات عند الحاجة إلى الاحتفاظ بها

إذا احتجتم إلى الاحتفاظ بالنص بعد انتهاء عمر مصدره، فانسخوه إلى std::string. فالنسخ هو تكلفة امتلاك البيانات.

#include <string>
#include <string_view>
std::string keep(std::string_view sv) {
    return std::string(sv); // owns a copy
}
int main() { (void)keep("persist"); }

قاعدة عامة

فضّلوا string_view للمعاملات والمتغيرات المحلية قصيرة العمر. وتجنّبوا استخدامه نوعًا للإرجاع أو عضوًا طويل العمر، ما لم يكن عمر البيانات أطول منه بوضوح.

تحقّق سريع

تحققوا من فهمكم لأعمار العروض.

مراجعة

لقد تعلّمتم مشكلات العروض وأعمارها:

  • لا تملك العروض البيانات؛ ويجب أن يبقى المصدر موجودًا مدةً أطول من العرض.
  • تجنّبوا العروض التي تشير إلى كائنات مؤقتة أو متغيرات محلية.
  • لا يُضمن انتهاء العروض بمحرف صفري؛ استخدموا size().
  • انسخوا البيانات إلى std::string عندما تحتاجون إلى الاحتفاظ بالنص.
البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «المشكلات ودورات الحياة» مجاني؟

نعم — نص درس «المشكلات ودورات الحياة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «المشكلات ودورات الحياة»؟

تجنّب العروض المتدلية تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المشكلات ودورات الحياة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا string_view
  2. إنشاء العروض
  3. المشكلات ودورات الحياة
  4. خوارزميات السلاسل النصية
← العودة إلى C++ Academy