for (int i = 1; i< BLOCK_SIZE - 1; ++i) newblock[i].next = &newblock[i + 1]; newblock[BLOCK_SIZE - l].next = 0; // Бос ұяшықтар тізімінің басын белгілейміз: headOfFree = &newblock[l]; р = newblock; } return p; // Белгіленген жадыға нұсқауышты қайтарамыз } Асыра жүктелген
new операциясы мұраланады, сондықтан ол туындайтын
объектілер үшін шақырылады. Егер олардың көлемдері негізгі объект көлеміне
сəйкес келмесе (осылай болуы əбден ықтимал), онда қиындықтар туындауы
мүмкін. Олардың алдын алу үшін операцияның басында көлемдердің сəйкес
келуі тексеріледі. Егер объектінің көлемі
new операциясы асыра жүктелген
көлемге тура келмесе, жадыны бөлуге сұраныс стандартты
new операциясына
беріледі.
pObj класын қолданатын программада оның статикалық өрістерін ини-
циалдау əрекеті орындалуы керек (статикалық өрістер 201 б. қарастырылды):
pObj *pObj::headOfFree; // Келісім бойынша 0 көрсетіледі const int pObj::BLOCK_SIZE = 1024; Бұл мысалдан көрініп тұрғандай, жадыны үнемдеумен қатар, жоғары
жылдамдыққа қол жеткізіледі, өйткені көбінесе жадыны бөлу үшін бірнеше
қарапайым операторлар қолданылады.
Егер
new операциясы асыра жүктелген болса,
delete операциясы үшін
де осы əрекет орындалуы керек (мысалы, біздің жағдайымызда стандартты
delete операциясы объектінің басында оның көлемдері туралы дұрыс ақпарат
таба алмайды, бұл өз кезегінде, программа іс-əрекеттерінің анықталмауына
алып келеді).
Қарастырылған мысалда
delete операциясы босатылған жады ұяшығын
бос ұяшықтар тізіміне қосуы керек:
void pObj::operator delete(void * ObjToDie, size_t size){ if (ObjToDie == 0) return;