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

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

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

تستخدم برامج C++‎ منطقتين رئيسيتين للذاكرة: الـ stack والـ heap. إن فهم مكان وجود الكائنات (objects) الخاصة بك أمر بالغ الأهمية لكتابة كود فعال وخالٍ من الأخطاء.

تُعد منطقة المكدس (stack) ذاكرة سريعة وتلقائية. المتغيرات التي يتم التصريح عنها داخل الدوال تعيش هنا ويتم تدميرها تلقائيًا عندما تخرج عن نطاق العمل (scope).

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

تعد الـ heap ذاكرة أكبر ولكنها أبطأ تديرها يدوياً. تبقى الكائنات الموجودة في الـ heap حتى تقوم بحذفها بشكل صريح.

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

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

Stack (المكدس)Heap (الكومة)
تخصيص سريعتخصيص أبطأ
حجم محدودسعة كبيرة
تنظيف تلقائييتطلب تنظيفاً يدوياً
كائنات ذات حجم ثابتكائنات ذات حجم ديناميكي

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

نسيان حذف ذاكرة الكومة (heap memory) يسبب تسربات الذاكرة (memory leaks)، وهي مصدر شائع للأخطاء في برامج C++.

challenge icon

التحدي

سهل

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

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

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

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

قم بتضمين ملف الرأس الخاص بك في main.cpp باستخدام #include "Counter.h".

ورقة مرجعية

تستخدم برامج C++ منطقتين رئيسيتين للذاكرة: المكدس (stack) والكومة (heap).

المكدس (stack) هو ذاكرة تلقائية وسريعة. المتغيرات المعلن عنها داخل الدوال تعيش هنا ويتم تدميرها تلقائيًا عندما تخرج عن النطاق:

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

الكومة (heap) هي ذاكرة أكبر ولكنها أبطأ تديرها يدويًا. الكائنات الموجودة في الكومة تستمر حتى تقوم بحذفها صراحةً:

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

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

المكدس (Stack)الكومة (Heap)
تخصيص سريعتخصيص أبطأ
حجم محدودسعة كبيرة
تنظيف تلقائييتطلب تنظيفًا يدويًا
كائنات ثابتة الحجمكائنات ديناميكية الحجم

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

جرّب بنفسك

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

using namespace std;

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

    // TODO: إنشاء Counter مخصص في الـ stack باستخدام inputName

    // TODO: إنشاء Counter مخصص في الـ heap باسم "HeapCounter"

    // TODO: طباعة اسم عداد الـ stack بتنسيق "Stack: <name>"

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

    // TODO: حذف العداد المخصص في الـ heap لمنع تسرب الذاكرة (memory leak)

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

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

جميع دروس Object Oriented Programming