مدیریت حافظه

آشنایی با مدیریت حافظه پویا در C++ با new و delete

مدیریت حافظه

مدیریت حافظه پویا (Dynamic Memory Management) به شما اجازه می‌دهد در زمان اجرا حافظه اختصاص دهید و آزاد کنید.

تخصیص حافظه (new)

type *pointer = new type;

آزادسازی حافظه (delete)

delete pointer;

مثال پایه

int *ptr = new int;  // تخصیص حافظه
*ptr = 42;            // مقداردهی
cout << *ptr;         // استفاده
delete ptr;           // آزادسازی
ptr = nullptr;        // جلوگیری از dangling pointer

آرایه پویا

int size = 5;
int *arr = new int[size];  // آرایه پویا

for (int i = 0; i < size; i++) {
    arr[i] = i * 10;
}

delete[] arr;  // آزادسازی آرایه
arr = nullptr;

مثال کاربردی

مثال 1: آرایه پویا با ورودی کاربر

int size;
cout << "تعداد عناصر را وارد کنید: ";
cin >> size;

int *arr = new int[size];

for (int i = 0; i < size; i++) {
    cout << "عنصر " << i << ": ";
    cin >> arr[i];
}

// استفاده از آرایه
for (int i = 0; i < size; i++) {
    cout << arr[i] << " ";
}

delete[] arr;
arr = nullptr;

مثال 2: ساختار پویا

struct Student {
    string name;
    int age;
};

Student *student = new Student;
student->name = "علی";
student->age = 20;

cout << student->name << " " << student->age;

delete student;
student = nullptr;

مشکلات حافظه پویا

نشت حافظه (Memory Leak)

void memoryLeak() {
    int *ptr = new int;
    *ptr = 42;
    // فراموش کردن delete!
}  // حافظه آزاد نمی‌شود

اشاره‌گر معلق (Dangling Pointer)

int *ptr = new int;
delete ptr;
// ptr هنوز به حافظه آزاد شده اشاره می‌کند
*ptr = 100;  // خطا!

اشاره‌گر دوگانه (Double Free)

int *ptr = new int;
delete ptr;
delete ptr;  // خطا! حافظه دو بار آزاد می‌شود

راه‌حل‌ها

استفاده از nullptr

int *ptr = new int;
delete ptr;
ptr = nullptr;  // جلوگیری از dangling pointer

بررسی null قبل از delete

if (ptr != nullptr) {
    delete ptr;
    ptr = nullptr;
}

Smart Pointers (C++11)

برای مدیریت خودکار حافظه از smart pointers استفاده کنید.

unique_ptr

#include <memory>
std::unique_ptr<int> ptr(new int(42));
// حافظه به طور خودکار آزاد می‌شود

shared_ptr

#include <memory>
std::shared_ptr<int> ptr1(new int(42));
std::shared_ptr<int> ptr2 = ptr1;  // اشتراک مالکیت

weak_ptr

#include <memory>
std::shared_ptr<int> shared(new int(42));
std::weak_ptr<int> weak = shared;  // بدون افزایش شمارنده

بهترین شیوه‌ها

نکات مهم

این مبحث بخشی از دوره آموزش کامل C++ است.

ابزارهای مرتبط