0Pricing
C++ Academy · درس

أخطاء الذاكرة الشائعة

تجنّب تسرّبات الذاكرة والمؤشرات المتدلية

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

تسرّبات الذاكرة

يحدث تسرّب الذاكرة عند تخصيص ذاكرة على الكومة دون تحريرها مطلقًا. ويستمر البرنامج في استهلاك ذاكرة لم يعد قادرًا على الوصول إليها.

void leak() {
    int* p = new int(5);
    // missing delete p;  -> leaked
}

المؤشرات المعلّقة

يشير المؤشر المعلّق إلى ذاكرة حُرّرت من قبل. وإلغاء الإشارة إليه سلوك غير معرّف.

int* p = new int(7);
delete p;
// *p = 3;   // BUG: dangling access

التحرير المزدوج

يؤدي استدعاء delete مرتين للمؤشر نفسه إلى إفساد الكومة، وغالبًا إلى تعطل البرنامج.

int* p = new int(1);
delete p;
// delete p;   // BUG: double free

الاستخدام بعد التحرير

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

تجاوز سعة المخزن المؤقت

تؤدي الكتابة بعد نهاية المصفوفة إلى الكتابة فوق ذاكرة غير مرتبطة بها. التزم دائمًا بالحدود.

int a[3] = {1, 2, 3};
// a[3] = 99;   // BUG: out of bounds

delete غير المتطابق

يُعد استخدام delete مع تخصيص أُجري باستخدام new[] (أو العكس) سلوكًا غير معرّف. احرص على إبقائهما متطابقين.

int* arr = new int[4];
// delete arr;   // BUG: should be delete[] arr;
delete[] arr;     // correct

المؤشرات غير المهيّأة

يحتوي المؤشر غير المهيّأ على قيمة عشوائية. هيّئه دائمًا إلى عنوان صالح أو إلى nullptr.

#include <iostream>

int main() {
    int* p = nullptr;   // safe default
    if (!p) std::cout << "not set\n";
}

إعادة العناوين المحلية

تؤدي إعادة عنوان متغير محلي على المكدس إلى إنشاء مؤشر معلّق فورًا، لأن المتغير المحلي يموت عند عودة الدالة.

int* bad() {
    int x = 10;
    return &x;   // BUG: x is gone
}

المؤشرات الذكية تمنع التسربات

يؤدي استبدال المالكين الخام بـ std::unique_ptr إلى التخلص من معظم التسربات وعمليات التحرير المزدوجة: إذ يصبح التنظيف تلقائيًا ويحدث مرة واحدة.

#include <iostream>
#include <memory>

int main() {
    auto p = std::make_unique<int>(5);
    std::cout << *p << "\n";
}   // freed exactly once, automatically

أدوات اكتشاف الأخطاء

تكتشف أدوات مثل AddressSanitizer وValgrind التسربات وعمليات التحرير المزدوجة والوصول خارج الحدود وقت التشغيل. اجعلها جزءًا من اختباراتك.

الوقاية أفضل من الاكتشاف

أفضل حل هو تجنب الملكية الخام تمامًا: استخدم حاويات مثل std::vector ومؤشرات ذكية كي تدير المكتبة الذاكرة إدارة صحيحة نيابةً عنك.

اختبار سريع

اختبر مدى فهمك لأخطاء الذاكرة.

مراجعة

تعلّمت أخطاء الذاكرة الشائعة: تسرّبات الذاكرة، والمؤشرات المعلّقة، والتحرير المزدوج، والاستخدام بعد التحرير، وتجاوزات سعة المخازن المؤقتة، وdelete غير المتطابق. امنعها باستخدام المؤشرات الذكية والحاويات، واكتشف ما يتبقى منها باستخدام أدوات التعقيم وValgrind.

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

هل درس «أخطاء الذاكرة الشائعة» مجاني؟

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

ماذا ستتعلم في «أخطاء الذاكرة الشائعة»؟

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

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

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

كم من الوقت يستغرق درس «أخطاء الذاكرة الشائعة»؟

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

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

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

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

  1. تخصيص الذاكرة على المكدس
  2. تخصيص الذاكرة على الكومة باستخدام new/delete
  3. دورة حياة الكائن
  4. أخطاء الذاكرة الشائعة
← العودة إلى C++ Academy