مدیریت حافظه در ++C — راهنمای جامع

۵۹۷ بازدید
آخرین به‌روزرسانی: ۰۱ مهر ۱۴۰۲
زمان مطالعه: ۳ دقیقه
مدیریت حافظه در ++C — راهنمای جامع

در این مقاله با مدیریت حافظه در ++C به روشی بهینه با استفاده از عملیات حذف/اضافه آشنا خواهیم شد. برای مطالعه بخش قبلی این سری مقالات آموزشی روی لینک زیر کلیک کنید:

از آرایه‌ها می‌توان برای ذخیره‌سازی چندین داده همگن استفاده کرد، اما استفاده از آرایه چندین عیب دارد. در زمان اعلان یک آرایه می‌توان حافظه را تخصیص داد، اما در اغلب موارد مقدار دقیق حافظه تا زمان اجرا قابل تشخیص نیست. بهترین کاری که در این حالت می‌توانیم انجام دهیم، این است که آرایه‌ای با بیشینه حافظه مورد نیاز اعلان کنیم. عیب این کار آن است که حافظه استفاده نشده به هدر می‌رود و نمی‌تواند از سوی برنامه‌های دیگر استفاده شود. برای اجتناب از این هدر رفت حافظه، می‌توان حافظه مورد نیاز را در زمان اجرا با استفاده از عملگر new و delete در ++C به صورت دینامیک تخصیص داد.

مثال 1: مدیریت حافظه در ++C

برنامه ++C برای ذخیره‌سازی GPA مربوط به n عدد از دانشجویان و نمایش آن در حالتی که n تعداد دانشجویان وارد شده از سوی کاربر باشد:

1#include <iostream>
2#include <cstring>
3using namespace std;
4int main()
5{
6    int num;
7    cout << "Enter total number of students: ";
8    cin >> num;
9    float* ptr;
10    
11    // memory allocation of num number of floats
12    ptr = new float[num];
13    cout << "Enter GPA of students." << endl;
14    for (int i = 0; i < num; ++i)
15    {
16        cout << "Student" << i + 1 << ": ";
17        cin >> *(ptr + i);
18    }
19    cout << "\nDisplaying GPA of students." << endl;
20    for (int i = 0; i < num; ++i) {
21        cout << "Student" << i + 1 << " :" << *(ptr + i) << endl;
22    }
23    // ptr memory is released
24    delete [] ptr;
25    return 0;
26}

خروجی

Enter total number of students: 4
Enter GPA of students.
Student1: 3.6
Student2: 3.1
Student3: 3.9
Student4: 2.9

Displaying GPA of students.
Student1:3.6
Student2:3.1
Student3:3.9
Student4:2.9

در این برنامه تنها حافظه مورد نیاز برای ذخیره‌سازی num، که از سوی کاربر وارد شده، تعداد داده‌های اعشاری است که به صورت دینامیک اعلان شده است.

عملگر new

1ptr = new float[num];

این عبارت در برنامه فوق یک اشاره‌گر به بخشی از حافظه بازگشت می‌دهد که به قدر کافی برای نگهداری عدد num داده‌های اعشاری کافی است.

عملگر delete

زمانی که حافظه با استفاده از عملگر delete تخصیص یافت، باید مجدداً آزاد شده و در اختیار سیستم عامل قرار گیرد. اگر برنامه از مقدار زیادی از حافظه با استفاده از new استفاده کند، سیستم ممکن است از کار بیافتد، زیرا برای عملکرد صحیح سیستم عامل حافظه‌ای باقی نمی‌ماند. عبارت زیر حافظه را مجدداً در اختیار سیستم عامل قرار می‌دهد:

1delete [] ptr;

براکت ها ([]) نشان‌دهنده این هستند که آرایه حذف شده است. اگر لازم باشد یک شیء منفرد را حذف کنید، نیازی به استفاده از براکت نیست:

1delete ptr;

مثال 2: مدیریت حافظه در ++C

در کد زیر از رویکرد شیءگرا برای مدیریت برنامه فوق در ++C استفاده شده است:

1#include <iostream>
2using namespace std;
3class Test
4{
5private:
6    int num;
7    float *ptr;
8public:
9    Test()
10    {
11        cout << "Enter total number of students: ";
12        cin >> num;
13        
14        ptr = new float[num];
15        
16        cout << "Enter GPA of students." << endl;
17        for (int i = 0; i < num; ++i)
18        {
19            cout << "Student" << i + 1 << ": ";
20            cin >> *(ptr + i);
21        }
22    }
23    
24    ~Test() {
25        delete[] ptr;
26    }
27    void Display() {
28        cout << "\nDisplaying GPA of students." << endl;
29        for (int i = 0; i < num; ++i) {
30            cout << "Student" << i+1 << " :" << *(ptr + i) << endl;
31        }
32    }
33    
34};
35int main() {
36    Test s;
37    s.Display();
38    return 0;
39}

خروجی این برنامه همانند برنامه فوق است. هنگامی که شیء s ایجاد می‌شود، سازنده فراخوانی می‌شود که حافظه‌ای برای داده‌های اعشاری num تخصیص می‌دهد. هنگامی که شیء تخریب می‌شود، یعنی زمانی که شیء از دامنه برنامه خارج می‌شود، تخریبگر به صورت خودکار فراخوانی خواهد شد.

1    ~Test() {
2        delete[] ptr;
3    }

این تخریبگر دستور ;delete[] ptr را اجرا کرده و حافظه را مجدداً در اختیار سیستم عامل قرار می‌دهد.

برای مطالعه قسمت بعدی از این مجموعه مطالب آموزشی می‌توانید روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *