Ko‘rsatkichlar



Yüklə 117,5 Kb.
səhifə6/7
tarix16.06.2023
ölçüsü117,5 Kb.
#131322
1   2   3   4   5   6   7
KO

Dangling/Wild pointers


Wild pointers — heapdagi biror xotiraga qiymat joylamasdan oldin o’sha manzilga qo’yilgan ko’rsatkich, masalan
long long int *son;
son wild pointer ga misol.
Dangling pointers — heapdagi qiymat o’chirib yuborilgach, ko’rsatkich hali ham o’sha manzilga ishora qilib turgan bo’lsa u dangling pointers deyiladi(delete qilinganda heapdagi qiymatlar o’chiriladi, lekin stackdagi ko’rsatkich NULL olmaydi):
int *a = new int(5);//normal ko’rsatkich
delete a;//xotira tozalandi, lekin a hali ham o’sha xotiraga ko’rsatkichligicha qolmoqda

Tozalangan xotira OS tomonidan yana boshqa maqsadlarda ishlatilinishi mumkin. Masalan sizning kodingizdagi boshqa bir turdagi ko’rsatkichni “qo’liga tushib” qolsa-chi? Yoki boshqa maqsadda OS undan foydalanishi, boshqalarga berib yuborishi mumkin. Muammo dastur ishlayotganda shunday ko’rsatkichlar paydo bo’lishida emas, muammo ulardan foydalanishda kelib chiqishi mumkin. Albatta, bunday chalkashliklar kamdan-kam kuzatiladi. Bunday holatlarni oldini olish uchun ko’rsatkichga NULL biriktirib qo’yamiz:
delete a;
a = NULL;

Agar kodni xavfsizroq+tozaroq qilmoqchi bo’lsangiz DRY(Don’t Repeat Yourself) ga asoslanib, ko’rsatkichni o’chirib unga NULL biriktirib qo’yadigan kichkinagina funksiyacha yozib olsangiz bo’ladi.
batafsil wikida: https://en.wikipedia.org/wiki/Dangling_pointer

Heapga qiymat kiritishning boshqa yo’llari[ixtiyoriy, bonus]


Albatta, bu yerda new dan tashqari calloc va malloclardan ham qiymat kiritishda foydalaniladi. new C++ da tanishtirilgan, u obyektni heapga joylayotganda konstruktorga murojaat qiladi lekin malloc/calloc esa aksincha. Bu ikki funksiyani stdlib.h dan topishingiz mumkin.
malloc()
yoki memory allocation, dinamik qiymat uchun heapdan joy ajratadi va unga ko’rsatkich qaytaradi. Ko’rsatkich void tipida bo’ladi, sintaksisi:
(tur*)malloc(bayt)
Agar xotiradan berilgan o’lchamdagi joyni ololmasa, NULL ni qaytaradi. U orqali xotiradan joy bron qilganimizda, avval ko’rsatkichni NULL emasligini tekshirib olishimiz kerak:
int *a((int*)malloc(sizeof(int)));// = ni o’rniga shunday biriktirsa ham bo’ladi
if(a!=NULL) *a = 4;
//kodlar
free(a);

malloc xotiradan joy olganda xotiradagi eski qiymatlarni o’zgartirmaydi.
sizeof(int) — int hajmini qaytaradi, bunda 4 bayt joy egallaydi. sizeof(int)*10 qilsak 10*4 = 40 baytlik joyni egallaydi, biz undan massiv sifatida foydalanishimiz mumkin.
calloc()
yoki contiguous allocation. Bu ham xotiradan berilgan sig’im bo’yicha joy ajratadi. malloc dan farqi shundaki, u ajratilgan xotirani avtomatik nollaydi. Asosan C da massivlar va strukturalar uchun ishlatiladi. Sintaksisi:
(tur*)calloc(soni, baytlar);
xotiradan baytlar*soni hajmda joy ajratadi. malloc xotiradan bitta katta blokni egallasa, calloc xotiradan “baytlar” o’lchamichalik “soni”ta blok oladi va har birini nollaydi.(@mumtozbekov ga mavzu bo’yicha bergan javoblari va tushunchalari uchun rahmat)
realloc()
Siz heapga massiv joylab, massivdagi ma’lumotlarni yo’qotmasdan uni dinamik kengaytirmoqchisiz? realloc shu xizmatni sizga bajarib beradi. Masalan:
int *massiv = (int*)malloc(10*sizeof(int));
//massiv hajmini 10dan 15 ga oshiramiz
massiv = (int*)realloc(massiv, 15*sizeof(int));
//kodlar
free(massiv);

realloc qayerdandir yangi hajmchalik joy topib, eski qiymatlarni o’sha yoqqa o’tkazvoradi, shu bilan birga qolib ketayotgan eski joyni tozalab qo’yadi va yangi manzilga ko’rsatkich qaytaradi.
free orqali xotiradagi qiymatlarni tozalab tashlaymiz. new va free ni, malloc/calloc va delete ni birga ishlatish tavsiya etilmaydi, u har xil kutilmagan natijalarni keltirib chiqarishi mumkin. Yaxshisi new bilan obyektni joyladingizmi, delete bilan o’chiring. malloc/calloc ishlatganingizda esa free yordamida heapni tozalang. malloc calloc ga qaraganda tezroq ishlaydi, lekin calloc nisbatan xavfsizroq.
malloc/calloc lar asosan C da ishlatiladi, C++ da new dan foydalanishni maslahat berishadi. Sababi C++ da classlardan foydalaniladi, obyektlarni heapga to’g’ri kiritishda new yaxshi, qolaversa u konstruktorni ham ishga soladi.

Yüklə 117,5 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin