Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ذاكرة Stack مقابل Heap

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy. الدرس 12 من 104.

تستخدم برامج C++ منطقتين رئيسيتين للذاكرة: المكدس وheap. إن فهم مكان وجود كائناتك أمر بالغ الأهمية لكتابة تعليمات برمجية فعّالة وخالية من الأخطاء.

إن المكدس هو ذاكرة سريعة وتلقائية. تعيش المتغيرات المُعلنة داخل الدوال هنا، ويتم تدميرها تلقائيًا عندما تخرج من نطاقها.

void example() {
    int x = 10;           // تخصيص المكدس
    Player player;        // تخصيص المكدس - يُدمَّر تلقائيًا
}   // يتم تدمير x و player هنا

إنَّ heap عبارة عن memory أكبر لكنها أبطأ، وتديرها يدويًا. تستمر الكائنات الموجودة في heap حتى تقوم صراحةً بتنفيذ delete لها.

void example() {
    Player* player = new Player();  // تخصيص الكومة
    // player موجود حتى يتم حذفه
    delete player;                   // التنظيف اليدوي مطلوب
}

الاختلافات الرئيسية:

StackHeap
تخصيص سريعتخصيص أبطأ
حجم محدودسعة كبيرة
تنظيف تلقائييلزم إجراء cleanup يدوي
كائنات ذات حجم ثابتكائنات ذات حجم ديناميكي

استخدم تخصيص المكدس للكائنات الصغيرة قصيرة العمر. استخدم تخصيص الكومة عندما تحتاج الكائنات إلى البقاء بعد انتهاء نطاقها أو عندما يتحدد حجمها في وقت التشغيل.

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

challenge icon

التحدي

سهل

لنستكشف الفرق بين ذاكرة المكدس وذاكرة heap من خلال إنشاء Counter بسيط يتتبع كيفية إنشاء الكائنات وتدميرها.

ستنشئ ملفين لتنظيم التعليمات البرمجية:

  • Counter.h: عرّف Counter class مع سمة private باسم name (من النوع string). أضف constructor يستقبل اسمًا ويطبع "Creating: <name>"، وdestructor يطبع "Destroying: <name>". أضف getName() method لإرجاع اسم العداد.
  • main.cpp: أوضح كلًا من stack وheap allocation. اقرأ اسمًا من input، ثم:
    • أنشئ Counter مخصصًا في stack باستخدام ذلك الاسم
    • أنشئ Counter مخصصًا في heap بالاسم "HeapCounter"
    • اطبع اسمي العدادين بالتنسيق "Stack: <name>" و"Heap: <name>"
    • احذف العداد المخصص في heap من أجل prevent حدوث تسرب في memory

راقب كيف تظهر رسائل constructor وdestructor بترتيب مختلف استنادًا إلى وقت إنشاء كل كائن وحذفه. سيُدمَّر كائن stack تلقائيًا عند انتهاء main()، بينما يجب حذف كائن heap صراحةً.

ضمّن ملف الترويسة في main.cpp باستخدام #include "Counter.h".

جرّب بنفسك

#include <iostream>
#include <string>
#include "Counter.h"

using namespace std;

int main() {
    // اقرأ الاسم من الإدخال
    string inputName;
    cin >> inputName;

    // TODO: أنشئ Counter مخصصًا على المكدس باستخدام inputName

    // TODO: أنشئ Counter مخصصًا على الكومة بالاسم "HeapCounter"

    // TODO: Print stack counter name in format "Stack: <name>"

    // TODO: اطبع اسم عداد الكومة بالتنسيق "Heap: <name>"

    // TODO: احذف العداد المخصص على الكومة لمنع تسرب الذاكرة

    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming

تدرّب بنفسك: مترجم C++ عبر الإنترنت