6.4. Supra?nc?rcarea operatorilor de alocare ?i eliberare dinamic? a memoriei

6.4. Supra?nc?rcarea operatorilor de alocare ?i eliberare dinamic? a memoriei

Este posibilitatea de a supra?nc?rca operatorii new ?i delete. Acest lucru poate fi f?cut, de exemplu, pentru a compatibiliza sistemul de alocare a memoriei nou C++ cu cel vechi C sau pentru a introduce un sistem propriu de alocare a memoriei, folosind metode speciale, cum ar fi folosirea fi?ierelor de pe disc ca memorie virtual? c?nd s-a epuizat memoria disponibil? din heap.

Forma general? de supra?nc?rcare a operatorului new ?n declararea clasei este urm?toarea:

void *[nume_clas?::]operator new (size_t marime)

{

   // codul func?iei de alocare

   …

   return pointer_la_memorie;

}

Tipul size_t este tipul predefinit ?n C++ ca un ?ntreg f?r? semn destinat pentru exprimarea m?rimilor zonelor de memorie, fiind capabil s? con?in? m?rimea celui mai mare bloc de memorie continu?. De exemplu, operatorul sizeof ?ntoarce valorile de tipul size_t. Parametrul marime va con?ine automat num?rul de octe?i necesari pentru a memora obiectul pentru care se face alocarea.

Dac? supra?nc?rcarea operatorului se face pentru o clas?, compilatorul va asigura apelul automat al constructorului, adic? nu trebuie de f?cut acest lucru ?n codul de supra?nc?rcare a func?iei de alocare. Codul func?iei de alocare poate face orice lucru de care ave?i nevoie, unicul lucru care trebuie s? fie respectat este ca func?ia de supra?nc?rcare a operatorului new trebuie s? returneze un pointer spre memoria alocat?, sau NULL, dac? apare o eroare de alocare.

Forma general? de supra?nc?rcare a operatorului delete ?n declararea clasei este urm?toarea:

void [nume_clas?::]operator delete (void *pointer)

{

   // codul func?iei de eliberare a blocului de memorie indicat?

   // de pointer

   …

}

Parametrul pointer va indica zona de memorie care a fost alocat? anterior ?i care trebuie s? fie eliberat?. Ar fi de dorit ca func?ia ce supra?ncarc? operatorul delete s? respecte aceste condi?ii. Dac? func?ia elibereaz? zona de memorie ocupat? de un obiect, automat va fi apelat destructorul pentru acest obiect, a?a c? nu trebuie f?cut acest lucru explicit.

Pentru exemplu, supra?nc?rc?m operatorii new ?i delete ?n clasa fractie_rationala, folosind mecanismul de alocare din C. Inser?m ?n sec?iunea public a clasei fractie_rationala urm?torul cod:

void *operator new(size_t marime)
{
   cout << "Sunt in new pentru fr!\n";
   return malloc(marime);
}
 
void operator delete(void *pointer)
{
   cout << "Sunt in delete pentru fr!\n";
   free(pointer);
}


?n func?iile de mai sus special au fost incluse c?te o instruc?iune de afi?are demonstrativ?. Ne asigur?m c? la ?nceputul programului nostru este conectat fi?ierul antet ”stdlib.h”, lans?m programul ?i analiz?m lucrul operatorilor new ?i delete supra?nc?rca?i, prin urm?rirea mesajelor Sunt in new pentru fr! ?i Sunt in delete pentru fr! care vor ap?rea printre ie?irile din exemplele precedente.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов