Ko‘rsatkichlar


Ko’rsatkichlar arifmetikasi



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

Ko’rsatkichlar arifmetikasi


Ko’rsatkichlarga inkrement/dekrement ni qo’llash orqali u ko’rsatayotgan manzilni siljita olamiz. Manzil ko’rsatkich tipichalik hajmda suriladi, masalan:
int *son = new int(5);
cout<<++son<
bunda ko’rsatkich ko’rsatayotgan manzil 4 baytga(int hajmichalik) surilganini ko’rasiz. Ko’rsatkichga son qo’shib surishimiz ham mumkin: ptr+son; bunda manzil ptr_turi*son chalik suriladi.
int *ptr;
ptr+5;//ptr avvalgi joyidan 4*5 birlikka suriladi

Umuman bu narsa massivlarda qo’l kelishi ham mumkin:
int arr[] = {1,2,3,4,5,6};
for(int* ptr = arr; ptrcout<<*ptr<<” — “;

Dinamik xotira bilan ishlayotganda ko’rsatkich ustida qo’shish/ayrishlarni bajarishda ehtiyot bo’lgan yaxshi. Umuman, bu unchalik ham yaxshi fikr bo’lmasligi mumkin — agar ko’rsatkichni to’g’ridan-to’g’ri inkrement/dekrement qilsangiz avvalgi joyni yo’qotib qo’yishingiz, yoki kodni o’qish uchun biroz noqulay qilib qo’yishingiz mumkin.

Memory Leakage


Stack haqida gaplashganimizdek, “Obyektlarni heapga joylash va o’chirish” bo’limi 1-namunadagi kodda main ishini tugatgach, heap dagi obyektga ko’rsatkich bo’lib turgan b ham o’chib ketadi, lekin heapdagi qiymat emas. Odatda juda ko’p zamonaviy OSlarda dastur ishini tugatgach heap OS tomonidan bo’shatiladi. Lekin agar dastur o’z ishini davom ettirishi kerak bo’lsachi? Masalan biror funksiya ichida dinamik o’zgaruvchilar ishlatib, uni o’chirmasdan ketdik:
{
long long int *a = new int(2341);
long long int *b = new long long int[11];
//kodlar

}

va bu bilan biz 96 baytlik xotirani ishlatmasak ham band qilib qo’ydik. Namunada biz heapdagi qiymatimizga ko’rsatkichni yo’qotamiz(chunki funksiya ishini tugatgach, ko’rsatkich ham stackdan o’chiriladi), natijada heapdagi qiymatga murojaat qila olmaymiz. Dastur ishini tugatmagani uchun qiymat heapda turaveradi. Hozirgi holatda bizda bekorchi 96 bayt joy egallagan xotira bor. Tanishing — bu holat inglizchasiga memory leakage deyiladi(o’zbekchaga chiroyli tarjima qilolmadim, shuning uchun atamani shundayligicha yozib ketaman). Ko’rsatkichimiz funksiya ishini bajarib bo’lgach, o’chib ketdi. Bizda ozgina band bo’lgan bekorchi joy bor, lekin unga qayta yozolmaymiz, chunki uni tozalab tashlash kerak, biz tozalamaganimiz uchun OS uni band deb ko’radi va bizga qayta foydalanishga bermaydi. Bu kichik holat, lekin agar kattaroq kodlar bilan ishlash bo’lganda-chi, klasslarimiz kattaroq ma’lumotlar bilan bo’lsa-chi?

uzr, fotoshopga yo’qroqman :) rasmga yordam berganlari uchun @ThereisnoKNOWLEDGEthatISnotPOWER ga alohida rahmat
Oddiy, qisqa kodlarda bu holat u qadar xavflimas. Lekin gap kattaroq hajmdagi dinamik obyektlar bilan ishlaydigan kodlar haqida ketganda, dastur ishini tugatmasdan oldin heap ni to’lib qolishi(heapoverflow)ga olib kelishi, ba’zida OSni crashga uchratishi ham mumkin. Menimcha, ularni o’chirib yurish yaxshi odat.

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