C xotirani bo‘shatish
Xotirani bo‘shatish (free)
Xotira bloki endi kerak bo‘lmaganda uni bo‘shatishingiz kerak. Bo‘shatish (deallocation) xotirani "freeing" qilish deb ham ataladi.
Dinamik xotira bo‘shatilguncha yoki dastur tugaguncha band holda qoladi.
Xotira bo‘shatilgach, undan boshqa dasturlar foydalanishi yoki hatto u dasturingizning boshqa qismiga ajratilishi mumkin.
Xotirani bo‘shatish
Xotirani bo‘shatish uchun free() funksiyasidan foydalaning:
free(pointer);
pointer parametri bo‘shatiladigan xotira manziliga ishora qiluvchi ko‘rsatkich:
int *ptr;
ptr = malloc(sizeof(*ptr));
free(ptr);
ptr = NULL;
Xotirani bo‘shatgandan so‘ng undan tasodifan foydalanishni davom ettirmaslik uchun ko‘rsatkichga NULL qiymatini berish yaxshi amaliyot hisoblanadi.
Agar xotira bo‘shatilgandan keyin ham undan foydalanishda davom etsangiz, boshqa dasturlarning yoki hatto o‘z dasturingizning boshqa qismining ma’lumotlarini buzib qo‘yishingiz mumkin.
Misol
Xatolarni tekshirish va xotirani bo‘shatishni o‘z ichiga olgan ishlaydigan misol:
int *ptr;
ptr = malloc(sizeof(*ptr)); // Allocate memory for one integer
// If memory cannot be allocated, print a message and end the main() function
if (ptr == NULL) {
printf("Unable to allocate memory");
return 1; // Exit the program with an error code
}
// Set the value of the integer
*ptr = 20;
// Print the integer value
printf("Integer value: %d\n", *ptr);
// Free allocated memory
free(ptr);
// Set the pointer to NULL to prevent it from being accidentally used
ptr = NULL;
O‘zingiz sinab ko‘ring »
Xotira sizib chiqishi (memory leak)
Xotira sizib chiqishi (memory leak) dinamik xotira ajratilib, lekin hech qachon bo‘shatilmaganda yuz beradi.
Agar xotira sizib chiqishi siklda yoki tez-tez chaqiriladigan funksiyada yuz bersa, u juda ko‘p xotirani egallab, kompyuterning sekinlashishiga sabab bo‘lishi mumkin.
Agar dinamik xotiraga ko‘rsatkich xotira bo‘shatilishidan oldin yo‘qolib qolsa, xotira sizib chiqishi xavfi tug‘iladi. Bu tasodifan sodir bo‘lishi mumkin, shuning uchun ehtiyot bo‘lish va dinamik xotiraga ko‘rsatkichlarni kuzatib borish muhim.
Quyida dinamik xotiraga ko‘rsatkich qanday yo‘qolishi mumkinligiga oid bir nechta misol keltirilgan.
1-misol
Ko‘rsatkich qayta yozib yuboriladi:
int x = 5;
int *ptr;
ptr = calloc(2, sizeof(*ptr));
ptr = &x;
Bu misolda ko‘rsatkich x o‘zgaruvchisiga ishora qiladigan qilib o‘zgartirilgandan so‘ng, calloc() ajratgan xotiraga endi murojaat qilib bo‘lmaydi.
2-misol
Ko‘rsatkich faqat funksiya ichida mavjud:
void myFunction() {
int *ptr;
ptr = malloc(sizeof(*ptr));
}
int main() {
myFunction();
printf("The function has ended");
return 0;
}
Bu misolda funksiya ichida ajratilgan xotira funksiya tugaganidan keyin ham ajratilgan holda qoladi, lekin unga endi murojaat qilib bo‘lmaydi. Bu muammoning oldini olish usullaridan biri — funksiya tugashidan oldin xotirani bo‘shatish.
3-misol
Qayta ajratish muvaffaqiyatsiz bo‘lganda ko‘rsatkich yo‘qoladi:
int* ptr;
ptr = malloc(sizeof(*ptr));
ptr = realloc(ptr, 2*sizeof(*ptr));
Agar realloc() xotirani qayta ajrata olmasa, u NULL ko‘rsatkichini qaytaradi va asl xotira band holda qoladi.
Bu misolda, agar realloc() muvaffaqiyatsiz bo‘lsa, NULL ko‘rsatkichi ptr o‘zgaruvchisiga o‘zlashtiriladi va asl xotira manzilini qayta yozib yuboradi, natijada unga endi murojaat qilib bo‘lmaydi.
Xulosa
Xulosa qilib aytganda, C tilida xotirani boshqarishda eng yaxshi amaliyotlarga amal qiling:
- Xotira ajratish muvaffaqiyatli bo‘lgan-bo‘lmaganini bilish uchun xatolarni (
NULLqaytarilgan qiymatlarni) tekshirishni unutmang - Xotira sizib chiqishining oldini oling — endi ishlatilmaydigan xotirani har doim bo‘shatishni unutmang, aks holda dastur sust ishlashi yoki undan ham yomoni, xotira tugab qolsa, ishdan chiqishi mumkin
- Xotirani bo‘shatgandan so‘ng undan tasodifan foydalanishni davom ettirmaslik uchun ko‘rsatkichga
NULLqiymatini bering
Maslahat: NULL haqida NULL bobida batafsil bilib olasiz.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
