Стандарт требует, чтобы любой распределитель мог освобождать память, произведенную любым другим распределителем того же типа, даже если это совершенно другой экземпляр. Это необходимо для правильной работы list::splice
. Это в значительной степени считается недостатком дизайна в спецификации C ++, и в C ++ 0x они представляют набор исправлений для распределителей, чтобы запомнить это. Между тем, любой распределитель, который вы используете в контейнерах STL, не должен иметь своего собственного локального состояния.
РЕДАКТИРОВАТЬ : Для тех из вас, кому нужен оригинальный язык, см. Раздел 20.1.5 / 4 спецификации C ++ ISO:
Реализация контейнеров, описанных в этом международном стандарте, разрешается предполагать, что их
Параметр шаблона распределителя удовлетворяет следующим двум дополнительным требованиям, помимо тех, которые указаны в таблице 32.
- Все экземпляры данного типа распределителя должны быть взаимозаменяемыми и всегда сравниваться равными
друг друга.
В последнем проекте ISO стандарта C ++ 0x это требование больше не присутствует. Значение по умолчанию std::allocator
будет по-прежнему поддерживать этот инвариант по мере необходимости, но не похоже, что вам придется ограничивать себя таким образом в будущем.