مدیریت حافظه
آشنایی با مدیریت حافظه پویا در 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; // بدون افزایش شمارنده
بهترین شیوهها
- همیشه حافظه تخصیص داده شده را آزاد کنید
- بعد از delete، nullptr را اختصاص دهید
- از smart pointers استفاده کنید
- مراقب memory leaks باشید
نکات مهم
- new حافظه در heap تخصیص میدهد
- delete حافظه را آزاد میکند
- delete[] برای آرایهها استفاده میشود
- smart pointers مدیریت خودکار انجام میدهند
این مبحث بخشی از دوره آموزش کامل C++ است.