آموزش برنامه نویسی قسمت 13 ( عملگر new و delete در زبان C++):

عملگرهای new و delete در C++

مدیریت حافظه پویا (Dynamic Memory Management) یکی از ویژگی‌های مهم زبان C++ است. این کار معمولاً با استفاده از دو عملگر اصلی انجام می‌شود:

new برای تخصیص حافظه

delete برای آزادسازی حافظه

1. چرا به حافظهٔ پویا نیاز داریم؟

در حالت معمولی، وقتی یک متغیر را داخل تابع تعریف می‌کنید، روی استک (Stack) ذخیره می‌شود و با پایان یافتن بلوک کد، از بین می‌رود.

اما گاهی نیاز داریم:

مقدار حافظه در زمان اجرا (Runtime) تعیین شود.

داده‌ها تا زمانی که خودمان بخواهیم باقی بمانند.

ساختارهای بزرگ (مثل آرایه‌های بزرگ) داشته باشیم.

در چنین مواقعی به حافظهٔ هیپ (Heap) نیاز داریم که با new و delete کنترل می‌شود.

2. عملگر new در C++

عملگر new حافظه را در هیپ رزرو می‌کند و آدرس آن را برمی‌گرداند.

مثال ساده:

int* ptr = new int;
*ptr = 10;

cout << *ptr; // خروجی: 10

در این مثال:

با new int یک خانهٔ حافظه روی هیپ ساختیم.

آدرس آن در پوینتر ptr ذخیره شد.

مقدار 10 در آن خانه ذخیره کردیم.

تخصیص همزمان با مقداردهی.

int* p = new int(25);

3. تخصیص حافظه برای آرایه‌ها

برای آرایه‌ها از new[] استفاده می‌کنیم:

int* arr = new int[5];
arr[0] = 10;
arr[1] = 20;

4. آزادسازی حافظه با delete

هر حافظه‌ای که با new گرفته می‌شود حتماً باید با delete آزاد شود؛ وگرنه نشتی حافظه (Memory Leak) پیش می‌آید.

مثال:

int* ptr = new int;
*ptr = 10;

// آزادسازی
delete ptr;

5. آزادسازی آرایه‌ها با delete[]

int* arr = new int[5];

// ...

delete[] arr;

اگر از delete بدون [] برای آرایه استفاده کنید، برنامه دچار رفتار نامشخص (Undefined Behavior) می‌شود.

6. خطاها و نکات مهم

1. هر new باید یک delete داشته باشد.

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

2. هرگز یک آدرس آزادشده را دوباره آزاد نکنید.

این کار خطرناک و غیرقابل پیش‌بینی است:

delete ptr;
delete ptr; // خطا

3. بعد از delete بهتر است پوینتر را nullptr کنید.

delete ptr;
ptr = nullptr;

4. برای مدیریت امن حافظه از smart pointer استفاده کنید.


مثال:

#include <iostream>
using namespace std;

int main() {
    // تخصیص یک عدد
    int* x = new int(50);
    cout << "x = " << *x << endl;

    // تخصیص یک آرایه
    int* arr = new int[3];
    arr[0] = 5;
    arr[1] = 10;
    arr[2] = 15;

    cout << "Array: ";
    for(int i = 0; i < 3; i++)
        cout << arr[i] << " ";

    // آزادسازی حافظه
    delete x;       // برای متغیرها
    delete[] arr;   // برای آرایه‌ها

    return 0;
}

Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com