Объекты Переменного Размера

Когда пользователь берет управление распределением и освобождением памяти, он может конструировать объекты, размер которых во время компиляции недетерминирован. В предыдущих примерах вмещающие (или контейнерные - перев.) классы vector, stack, intset и table реализовывались как структуры доступа фиксированного размера, содержание указатели на реальную память. Это подразумевает, что для создания таких объектов в свободной памяти необходимо две операции по выделению памяти, и что любое обращение к хранимой информации будет содержать дополнительную косвенную адресацию. Например:

class char_stack { int size; char* top; char* s; public: char_stack(int sz) { top=s=new char[size=sz]; } ~char_stack() { delete s; } // деструктор void push(char c) { *top++ = c; } char pop() { return *--top; } };

Если каждый объект класса размещается в свободной памяти, это делать не нужно. Вот другой вариант:

class char_stack { int size; char* top; char s[1]; public: char_stack(int sz); void push(char c) { *top++ = c; } char pop() { return *--top; } }; char_stack::char_stack(int sz) { if (this) error("стек не в свободной памяти"); if (sz < 1) error("размер стека < 1"); this = (char_stack*) new char[sizeof(char_stack)+sz-1]; size = sz; top = s; }

Заметьте, что деструктор больше не нужен, поскольку память, которую использует char_stack, может освободить delete без всякого содействия со стороны программиста.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: