C xotirani bo‘shatish


ULASHISH

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:

  1. Xotira ajratish muvaffaqiyatli bo‘lgan-bo‘lmaganini bilish uchun xatolarni (NULL qaytarilgan qiymatlarni) tekshirishni unutmang
  2. 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
  3. Xotirani bo‘shatgandan so‘ng undan tasodifan foydalanishni davom ettirmaslik uchun ko‘rsatkichga NULL qiymatini bering

Maslahat: NULL haqida NULL bobida batafsil bilib olasiz.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!