436 Часть III. Современное программирование на C++
. s.tudentList. Destroy (0) ; // Элемент уничтожен независимо //от принадлежности.
studentList.Flush(); // Элементы уничтожены, хотя // кому-то и принадлежат.
return 0;
}
void WriteOwnership(STUDENT_LIST sstudentList) (
if (studentList.OwnsElements())
cout « "Список студентов — собственник своих объектов." « endl;
else
cout « "Список студентов — не собственник своих объектов." « endl;
}
Прямые массивы всегда являются собственниками своих объектов. При добавлении в контейнер объекты копируются. Когда элемент .удаляется из прямого контейнера, объект в контейнере уничтожается. TShouldDelete не является базовым классом прямых контейнеров, поэтому OwnsElements не является функцией-членом класса прямых контейнеров.
Специальное управление памятью
Каждый контейнер имеет версию, которая позволяет пользователю управлять памятью для объектов контейнера. Предоставляемая пользователем процедура управления памятью (менеджер памяти, memory manager) должна быть оформлена как класс. Предположим, что STUDENT_MEMORY_MANAGER — это класс, который определяет операции new, new[], delete и delete [] для класса STUDENT. В этом случае STUDENT_LIST может быть объявлен следующим образом:
typedef TMArrayAsVector<STUDENT, STUDENT_MEMORY_MANAGER> STUDENT_LIST;
Буква м в имени шаблона указывает, что этот шаблон требует наличия менеджера памяти, определенного пользователем.
Все классы-контейнеры происходят от "М" версий. "НеМ" версии используют стандартный класс управления памятью — TStandardAiiocator из alloctr.h. TStandardAiiocator работает с глобально определенными операциями new, new [ ], delete И delete [ ].
Определение собственного менеджера памяти довольно редкое явление. Например, при написании приложений, для которых критична скорость, может возникнуть необходимость создать для класса собственные операции
new И delete.