آزادسازی حافظه (Deallocate Memory)
وقتی دیگر به حافظه نیاز نداری، باید آن را آزاد کنی. «آزادسازی حافظه (Deallocation)» یعنی برگرداندن آن فضا به سیستم. حافظه پویا تا آزاد نشود، رزروشده می ماند.
آزادسازی با free()
تابع free() یک «اشاره گر (Pointer)» می گیرد و همان حافظه را آزاد می کند. سپس می توانی اشاره گر را NULL کنی تا اشتباهی استفاده نشود.
#include <stdlib.h>
int *ptr;
ptr = malloc(sizeof(*ptr));
free(ptr);
ptr = NULL;
نمونه کامل با بررسی خطا
اگر حافظه نرسد، malloc مقدار NULL می دهد. پس اول بررسی کن، بعد استفاده کن، و در پایان آزاد کن.
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = NULL;
ptr = malloc(sizeof(*ptr));
if (ptr == NULL) {
printf("Unable to allocate memory\n");
return 1;
}
*ptr = 20;
printf("Integer value: %d\n", *ptr);
free(ptr);
ptr = NULL;
return 0;
}
نشت حافظه (Memory Leak)
نشت حافظه یعنی حافظه گرفته شده ولی هرگز آزاد نشده است. اگر داخل حلقه رخ دهد، سیستم کُند می شود. دلیل رایج، گم شدن اشاره گر است.
مثال 1: اشاره گر بازنویسی می شود
اینجا آدرس حافظه پویا گم می شود؛ چون اشاره گر جای دیگری را نشان می دهد.
#include <stdlib.h>
int x = 5;
int *ptr;
ptr = calloc(2, sizeof(*ptr));
ptr = &x;
مثال 2: اشاره گر فقط داخل تابع است
پس از پایان تابع، دیگر دسترسی به آن حافظه نداری. باید قبل از خروج، آزاد شود.
#include <stdlib.h>
#include <stdio.h>
void myFunction() {
int *ptr;
ptr = malloc(sizeof(*ptr));
/* بهتر است اینجا free(ptr) صدا زده شود */
}
int main() {
myFunction();
printf("The function has ended");
return 0;
}
مثال 3: شکست در realloc و از دست رفتن آدرس
اگر realloc شکست بخورد و مستقیم در همان متغیر بریزی، آدرس قبلی گم می شود.
#include <stdlib.h>
int *ptr;
ptr = malloc(sizeof(*ptr));
ptr = realloc(ptr, 2 * sizeof(*ptr));
هشدار: برای جلوگیری از این مشکل، نتیجه realloc را در یک متغیر موقت بریز. سپس اگر NULL نبود، جابه جا کن.
گام های عملی
- پس از پایان کار،
free(pointer)را صدا بزن. - بلافاصله اشاره گر را
NULLکن. - از بازنویسی اشاره گر بدون
freeخودداری کن. - در
reallocاز متغیر موقت استفاده کن.
نکته: برای ادامه مباحث، صفحه تخصیص مجدد حافظه و مرجع کلی مدیریت حافظه را ببین. همچنین مباحث اختصاص حافظه و دسترسی به حافظه مکمل هستند.
جمع بندی سریع
- همیشه پس از استفاده،
freeرا صدا بزن. - اشاره گر آزادشده را
NULLکن. - از نشت حافظه در حلقه ها جلوگیری کن.
- در
reallocآدرس قبلی را نسوزان.