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;
Достарыңызбен бөлісу: |