Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.