English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمية C++ الأساسية

تحكم في العملية في C++

وظيفة C++

مصفوفات و 字رين في C++

هياكل بيانات C++

فئات ورموز C++

مؤشر C++

الوراثة C++

تعليمية STL C++

دليل مرجعي لـ C++

إدارة ذاكرة C++ (new و delete)

في هذا المقال، ستتعلم كيفية إدارة الذاكرة بشكل فعال في C++ باستخدام عمليات new و delete.

المصفوفةيمكن استخدامها لتخزين بيانات متعددة من نفس النوع، ولكن هناك عيوب خطيرة في استخدام المصفوفات.

يجب تخصيص الذاكرة عند إعلان المصفوفة، ولكن في معظم الحالات يمكن تحديد الذاكرة المطلوبة بالضبط فقط أثناء التشغيل.

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

من النقاط السلبية أن الذاكرة غير المستخدمة معطلة ولا يمكن استخدامها من قبل أي برنامج آخر.

لمنع إهدار الذاكرة، يمكنك استخدام عمليات new و delete في C++ لتخصيص الذاكرة الديناميكية اللازمة أثناء التشغيل.

مثال 1: إدارة الذاكرة في C++

برنامج C++ يحفظ درجات n من الطلاب ويظهرها، حيث n هو عدد الطلاب المطلوب من المستخدم إدخال عدد الطلاب.

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int num;
    cout << "ادخل عدد الطلاب: ";
    cin >> num;
    float* ptr;
    
    // بيانات float تم تخصيص الذاكرة لها
    ptr = new float[num];
    cout << "ادخل درجات الطالب." << endl;
    for (int i = 0; i < num; ++i)
    {
        cout << "طالب" << i + 1 << " : ";
        cin >> *(ptr + i);
    }
    cout << "\nعرض درجات الطالب." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "طالب" << i + 1 << "  : " << *(ptr + i) << endl;
    }
    // ptr ذاكرة تم إطلاقها
    delete [] ptr;
    return 0;
}

نتيجة الخروج

ادخل عدد الطلاب: 5
ادخل درجات الطالب.
طالب1: 295
طالب2: 485
طالب3: 650
طالب4: 700
طالب5: 540
عرض درجات الطالب.
طالب1 :295
طالب2 :485
طالب3 :650
طالب4 :700
طالب5 :540

في هذا البرنامج، يتم إعلان الذاكرة بشكل ديناميكي فقط للذاكرة المطلوبة لتخزين num عدد من القيم الفلانية (المقدمة من المستخدم).

عملاق new

ptr = new float[num];

عبرة في البرنامج أعلاه تعود نقطة إلى جزء من الذاكرةالنقطة، ويكون هذا الذاكرة كافية لتكون مساحة لتخزين num بيانات浮punk.

عملاق delete

بعد تخصيص الذاكرة باستخدام عملاق new، يجب إرجاعها إلى نظام التشغيل.

إذا استخدمت برنامج يحتاج إلى الكثير من الذاكرة باستخدام new، قد ينهار النظام لأن نظام التشغيل لا يملك ذاكرة متاحة، مما يؤدي إلى استنفاد الذاكرة.

عبارات أعلاه ستعيد إرجاع الذاكرة إلى نظام التشغيل.

delete [] ptr;

المثلثات [] تشير إلى أن المصفوفة تم حذفها. إذا كنت بحاجة إلى حذف عنصر واحد فقط، لا تحتاج إلى استخدام المثلثات. مثل:

delete ptr;

مثال 2: إدارة ذاكرة C++

في C++لمعالجة البرنامج المذكور أعلاه باستخدام منهجية التوجه للكائنات.

#include <iostream>
using namespace std;
class Test
{
private:
    int num;
    float *ptr;
public:
    Test()
    {
        cout << "ادخل عدد الطلاب: ";
        cin >> num;
        
        ptr = new float[num];
        
        cout << "ادخل درجات الطالب." << endl;
        for (int i = 0; i < num; ++i)
        {
            cout << "طالب" << i + 1 << " : ";
            cin >> *(ptr + i);
        }
    }
    
    ~Test() {
        delete[] ptr;
    }
    void Display() {
        cout << "\nعرض درجات الطالب." << endl;
        for (int i = 0; i < num; ++i) {
            cout << "طالب" << i+1 << "  : " << *(ptr + i) << endl;
        }
    }
    
};
int main() {
    Test s;
    s.Display();
    return 0;
}

يكون خروج البرنامج نفسه كما في نتيجة البرنامج المسبق.

تُدعى وظيفة التأسيس عند إنشاء كائن s، وتُخصص ذاكرة للبيانات العددية.

تُدعى الوظيفة التدميرية تلقائيًا عند تدمير الكائن، أي عند خروج الكائن من نطاقه.

    ~Test() {
        delete[] ptr;
    }

هذه الوظيفة التدميرية تنفذ delete[] ptr; وتعيد الذاكرة إلى نظام التشغيل.