![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
New және delete операторларын қайта анықтау
Жадыны басқ арудың балама нұ сқ аларын қ амтамасыз ету ү шін обьектіге динамикалық жадыны жә не сә йкесінше обьект массивтерін бө луге new жә не new [ ] операторларының, сонымен қ атар delete жә не оны босату ү шін delete [] операцияларының ө зіндік нұ сқ аларын анық тауғ а болады. Бұ л функция-операторлар келесі ережелерге сай болуы тиіс: - Оларғ а класс типінің параметрлерін беру қ ажет емес; - new жә не new [ ] функцияларына бірінші параметр болып size_t типті обьектінің кө лемі жіберілуі тиіс (бұ л sizeof операторымен қ айтарылатын тип, ол < stddef. h> тақ ырыптық файлда анық талады); шақ ырғ ан кезде ол функцияларғ а тү сініксіз тү рде жіберіледі; - return сілтегішті ө зге типтерге қ айтарып тұ рса да, олар void* мә нінің қ айтарылатын типімен анық талуы керек; - delete операторы void қ айтарымының типіне жә не void* типінің бірінші аргументіне ие болу керек; - Жадыны бө лу жә не босату оперторлары класстың статистикалық элементтері болып табылады. Қ айта анық талғ ан операторлар ә рекеті олармен жасырын тү рде орындалатын ә рекеттерге сай келуі тиіс. New операторы ү шін бұ л ол дұ рыс мағ ынаны қ айтаруы керек, нө лдік кө лемдегі жадты бө луге сұ ранысты корректілі тү рде ө ң деп жә не сұ ранысты орындау мү мкіншілігі болмағ ан кеэде шығ арып тастап отыруды білдіреді. Delete операторы ү шін нө лдік сілтегішті жою қ ауіпсізболуы керек екендігін ескерген жө н, сондық тан оператор ішінде сілтегішті нө лге жә не тепе-тең дік жағ дайындағ ы кез-келген ә рекеттің жоқ екендігіне тексеру жү ргізу керек. Жадыны бө лудің жә не босатудың қ алыпты операторлары класстың ә рекет облысында қ айта анық талғ андармен бірге қ олданылуы мү мкін (кө рінетін облысқ а кіретін операторлар кө мегімн:: (осы класс жә не ө згелері ү шін де). Жадыны бө лу операторын қ айта жү ктеу жадыны ү немдеу ү шін, бағ дарламаның тез жұ мыс жасауы жә не мә ліметтерді кейбір белгілі бір облыстарғ а орнату ү шін қ олданылады. Мысалы, кейбір обьектіге сілтегіші бар класс сипатталсын: class Obj { … }; class pObj { … private: Obj *p; }; p0bj типіндегі обьект астына new қ алыпты операторының кө мегімен жадыны бө лу кезінде pObj *p = new pObj; байттардың нақ тылы кө лемі sizeof(p0bj) асып кетеді, себебі new, ә детте бө лінетін облыстың басына оның кө лемін жазып кетеді (delete операторларын дұ рыс ө ң деу ү шін). Шағ ын обьектілер ү шін бұ л накладты шығ ындар маң ызды болуы мү мкін. Жадыны ү немдеу ү шін жадының ү лкен блогын бө ліп отыратын, кейін онда 0bj сілтегіштерді орнататын ө зіндік p0bj классты new операторын жазуғ а болады. Бұ л ү шін p0bj обьектісіне head0free статикалық жолы енгізіледі, онда келесі обьектіні орнатуғ а арналғ ан блоктың бірінші бос ұ яшығ ына сілтегіш сақ талады Қ олданылмайтын ұ яшық тар тізімге жиналады. Байланыс жолының астында жадты алмау ү шін, бірлестік қ олданылады (union), оның кө мегімен бір ұ яшық не обьектіге сілтеуішті орнату ү шін, не келесі бос ұ яшық пен байланыс ү шін қ олданылады: class pObj { public: static void * operator new(size_t size); … private: union { Obj *p / / обьектіге сілтеуіш pObj *next; / /келесі бос ұ яшық қ а сілтеуіш }; static const int BLOCK_SIZE; / / блок колемі // бос ұ яшық тар тізімінің атауы static pObj *headOfFree; }; void * pObj:: operator new(size_t size) { // жадының дұ рыс емес кө лемінің сұ ранысын қ айта бағ ыттау //new қ алыпты операциясы If (size! = sizeof(pObj)) return:: operator new(size); pObj *p = headOfFree; // бірінші бос ұ яшық қ а сілтегіш //бос ұ яшық тар тізімінің сілтегішінің орнын ө згерту If (p) headOfFree = p -> next; // егер бос жады болмаса, кезекті блокты бө лім аламыз: else { pObj *newblock =static_cast< pObj*> (:: operator new(BLOCK_SIZE * sizeof(pObj))); // біріншіден басқ а барлық ұ яшыұ тар бос емес (ол //бос болмайды). Оларды жинаймыз: for (int i= 1; i< BLOCK_SIZE - 1; ++i) newblock[ i ].next = & newblock[ I + 1 ]; newblock[BLOCK_SIZE - 1 ].next = 0; //бос ұ яшық тар орнатамыз: headOfFree = & newblock[ 1 ]; p =newblock; } return p; // Сілтегішті бө лінген жадығ а қ айтарамыз } Қ айта анық талғ ан new операторы мұ рағ а беріледі, сондық тан ол туынды обьектілер ү шін шақ ырылады. Егер олардың кө лемдері базалық кө лемге сай келмесе, бұ л ашық жер қ алдыруы мү мкін. Оларды болдырмау ү шін оператор басында кө лемнің сә йкестігі тексеріледі. Егер обьект кө лемі new операторы қ айта шақ ырылғ ан кө лемге сә йкес келмесе, жадыны бө луге сұ раныс new қ алыпты операторына жіберіледі. p0bj класын қ олданатын бағ дарламада оның статикалық жолдарының инилизациясы болуы тиіс: pObj *pObj:: headOfFree; // 0 ге жасырын тү рде қ ойылады const int pObj:: BLOCK_SIZE = 1024; Бұ л мысалдан кө ріп отырғ анымыздай, жадыны ү немдеуден басқ а жоғ ары тез ә сер етуге де қ ол жеткіземіз. Себебі кө п жағ дайда жадыны бө лу бірнеше қ арапайым операторларғ а тү сіріледі. Ә рине, егер new операторы қ айта анық талса, delete операторы ү шін де дә л солай болу керек (мысалы, біздің жағ дайымызда delete қ алыпты операторы обьект басында оның кө лемі туралы дұ рыс мә ліметті таба алмауы мү мкін, бұ л бағ дарламаның нақ тылы емес ә ркет етуіне алып келеді). Void pObj:: operator delete(void * ObjToDie. Size_t size) { if (ObjToDie == 0) return; if (size! = sizeof(pObj)) { :: operator delete(ObjToDie); return; } pObj *p = static_cast< pObj*> (ObjToDie); p-> next = headOfFree; headOfFree = p; } Delete операторында обьектілер кө лемінің сә йкестігінің тексерісі оындалғ ан, ол new операторында келтірілгенге бара-бар. Бақ ылау сұ рақ тары: 1. Операторды қ айта анық тау дегеніміз не? 2. Қ айта жү ктеу дегеніміз не? 3. Қ андай операторларды қ айта анық тауғ а болмайды? 4. Қ айта анық талғ ан операторларды шақ ыру формалары қ андай? Ә дебиеттер: 1. Г.С. Иванова и др. ООП: Учебник для вузов, М., Изд-во МГТУ им.Баумана, 2003.- 368 с. 2. Павловская Т.А. С и С++. Программирование на языке высокого уровня. 3. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004 4. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учебное пособие. – М.: Финансы и статистика, 2004
|