Объекты Переменного Размера
Когда пользователь берет управление распределением и освобождением памяти, он может конструировать объекты, размер которых во время компиляции недетерминирован. В предыдущих примерах вмещающие (или контейнерные - перев.) классы 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
Заметьте, что деструктор больше не нужен, поскольку память, которую использует char_stack, может освободить delete без всякого содействия со стороны программиста.