pObj класы үшін өзіндік
new опе-
рациясын жазуға болады, ол жадының үлкен блогын бөліп, содан кейін онда
Obj объектісіне нұсқауыштарды орналастырады. Бұл үшін
pObj объектісіне
headOfFree статикалық өрісі енгізіледі, бұл өрісте кезекті объектіні орнала-
стыру үшін блоктың алғашқы бос объектісіне нұсқауыш сақталады.
Қолданылмайтын ұяшықтар тізімге байланыстырылады. Байланыс өрісіне
жады жұмсамау үшін біріктірме (
union ) қолданылады, оның көмегімен бір
ғана ұяшық объектіге нұсқауышты орналастыру үшін де немесе келесі бос
ұяшықпен байланыс орнату үшін де қолданылады:
class pObj{ public: static void * operator new(size_t size); ... private: union{ Obj *p; // Объектіге нұсқауыш pObj *next; // Келесі бос ұяшыққа нұсқауыш }; static const int BLOCK_SIZE;// Блоктың өлшемі // Бос ұяшықтар тізімінің тақырыбы: static pQbj *headOfFree; }; void * pObj::operator new(size_t size){ // new стандартты операциясының дұрыс көрсетілмеген // жады көлеміне сұранысын қайта бағыттау: if (size != sizeof(pObj)) return ::operator new(size); pObj *p = headOfFree; //Алғашқы бос ұяшыққа нұсқауыш // Бос ұяшықтар тізімінің нұсқауышын жылжыту: if (p) headOfFree = р -> next; 14-1140
210
// Егер жадыда бос орын болмаса, кезекті блокты бөлеміз: else { pObj *newblock = static_cast
1 (::operator new(BLOCK_SIZE * sizeof(pObj))); // Біріншіден басқа барлық ұяшықтар бос (ол // қолданылуда), оларды байланыстырамыз: