Подтвердить что ты не робот

Гарантировано ли, что стандартные библиотеки библиотеки С++ вызывают заменяемые новые функции?

Если я заменил все подписи operator new, которые я могу, по крайней мере, на те версии, которые я тестировал, я вижу, что стандартные контейнеры вызывают мои замененные версии для выделения памяти.

Гарантируется ли это стандартом? То есть, было бы незаконным для реализации использовать оптимизированную версию, которая не вызывала бы мои функции замены для памяти, лежащей в основе стандартных контейнеров?

4b9b3361

Ответ 1

Распределитель по умолчанию для контейнеров, поддерживающих распределитель, таких как std::vector<T>, равен std::allocator<T>. Этот шаблон класса описан в разделе [default.allocator] стандарта. Согласно [allocator.members]/6 в С++ 14:

хранилище получается путем вызова ::operator new(std::size_t)

Итак, глобальный оператор new - тот, который вам нужно заменить. Если вы перегрузили operator new специально для T, эта перегрузка не будет использоваться распределителем по умолчанию.

Ответ 2

Гарантируется ли это стандартом?

Пока вы не используете настраиваемый распределитель для создания экземпляра контейнера, я считаю, что это правда.

От http://en.cppreference.com/w/cpp/memory/allocator

Шаблон класса std::allocator - это Allocator по умолчанию, используемый всеми стандартными библиотечными контейнерами, если не указан назначенный пользователем распределитель.

и

Из http://en.cppreference.com/w/cpp/memory/allocator/allocate:

Выделяет n * sizeof(T) байты неинициализированного хранилища, вызывая ::operator new(std::size_t)