Контейнерная библиотека STL. Законно ли вызывать метод выделения / освобождения в разных экземплярах класса распределителя? - PullRequest
3 голосов
/ 24 июля 2011

Прежде всего, я так не думаю. Но я наблюдал такое поведение с MSVC 10.0 в режиме отладки. Я использую пользовательский класс allocator, который полагается на пользователя для передачи только указателей, выделенных в одном экземпляре, в deallocate. Однако в режиме Release мой код работает.

Это ошибка или я ошибаюсь?

1 Ответ

6 голосов
/ 24 июля 2011

Стандарт требует, чтобы любой распределитель мог освобождать память, произведенную любым другим распределителем того же типа, даже если это совершенно другой экземпляр. Это необходимо для правильной работы list::splice. Это в значительной степени считается недостатком дизайна в спецификации C ++, и в C ++ 0x они представляют набор исправлений для распределителей, чтобы запомнить это. Между тем, любой распределитель, который вы используете в контейнерах STL, не должен иметь своего собственного локального состояния.

РЕДАКТИРОВАТЬ : Для тех из вас, кому нужен оригинальный язык, см. Раздел 20.1.5 / 4 спецификации C ++ ISO:

Реализация контейнеров, описанных в этом международном стандарте, разрешается предполагать, что их Параметр шаблона распределителя удовлетворяет следующим двум дополнительным требованиям, помимо тех, которые указаны в таблице 32.

- Все экземпляры данного типа распределителя должны быть взаимозаменяемыми и всегда сравниваться равными друг друга.

В последнем проекте ISO стандарта C ++ 0x это требование больше не присутствует. Значение по умолчанию std::allocator будет по-прежнему поддерживать этот инвариант по мере необходимости, но не похоже, что вам придется ограничивать себя таким образом в будущем.

...