Язык программирования C++. Вводный курс



Операторы new и delete - часть 3


Рассмотрим реализацию операторов new()

и delete() в классе Screen

более детально. В основе нашей стратегии распределения памяти будет лежать связанный список объектов Screen, на начало которого указывает член freeStore. При каждом обращении к оператору-члену new() возвращается следующий объект из списка. При вызове delete()

объект возвращается в список. Если при создании нового объекта список, адресованный freeStore, пуст, то вызывается глобальный оператор new(), чтобы получить блок памяти, достаточный для хранения screenChunk объектов класса Screen.

Как screenChunk, так и freeStore

представляют интерес только для Screen, поэтому мы сделаем их закрытыми членами. Кроме того, для всех создаваемых объектов нашего класса значения этих членов должны быть одинаковыми, а следовательно, нужно объявить их статическими. Чтобы поддержать структуру связанного списка объектов Screen, нам понадобится третий член next:

class Screen {

public:

   void *operator new( size_t );

   void operator delete( void *, size_t );

   // ...

private:

   Screen *next;

   static Screen *freeStore;

   static const int screenChunk;

};

Вот одна из возможных реализаций оператора new() для класса Screen:

#include "Screen.h"

#include <cstddef>

// статические члены инициализируются

// в исходных файлах программы, а не в заголовочных файлах

Screen *Screen::freeStore = 0;

const int Screen::screenChunk = 24;

void *Screen::operator new( size_t size )

{

   Screen *p;

   if ( !freeStore ) {

      // связанный список пуст: получить новый блок

      // вызывается глобальный оператор new

      size_t chunk = screenChunk * size;

      freeStore = p =

         reinterpret_cast< Screen* >( new char[ chunk ] );

      // включить полученный блок в список

      for ( ;

            p != &freeStore[ screenChunk - 1 ];

            ++p )

          p->next = p+1;

      p->next = 0;

    }

    p = freeStore;

    freeStore = freeStore->next;

    return p;

<


Содержание  Назад  Вперед