Как пользовательский распределитель может узнать, указывает ли указатель на массив?
Я мог бы неправильно понять некоторые понятия о распределителе. Но я действительно не знаю, почему нам нужен аргумент std::size_t
быть переданным allocate
указать количество объектов, которые будут выделены. Используется ли аргумент для выделения областей памяти, таких как массивы или векторы?
Если они есть, то как мой пользовательский распределитель может узнать, указывает ли ранее возвращенный указатель на область или просто на объект? Отвечает ли мой распределитель за ведение учета этих указателей?
Если нет, то зачем нам этот аргумент?
2 ответа
allocator_traits<YourAllocator<T>>::allocate
как ожидается, выделит память для непрерывной последовательности N объектов типа T
, N предоставляется size_t
параметр.
Если они есть, то как мой пользовательский распределитель может узнать, указывает ли ранее возвращенный указатель на область или просто на объект?
Что такое "ранее возвращенный указатель"?
Ваш распределитель будет сказано, когда выделять и когда освобождать память. Когда происходит освобождение, ему будет сказано, что N было для выделения, которое освобождается. Ваш распределитель не должен отслеживать какие-либо указатели.
Предполагая, что вы говорите о std::allocator здесь. Документация довольно ясна:
T* std::allocator::allocate(std::size_t n);
Выделяет n * sizeof(T) байтов неинициализированного хранилища [...]
Поэтому ответ на ваш вопрос будет следующим: Да, аргумент используется для выделения областей памяти, таких как массивы или векторы.
И для вашего последующего вопроса: нет, вам не нужно отслеживать возвращенные указатели, потому что std::allocator::deallocate
гарантированно вызывается с тем же n
как std::allocator::allocate
был для любого из возвращенных указателей.
void std::allocator::deallocate( T* p, std::size_t n );
Отменяет выделение памяти, на которую ссылается указатель p, который должен быть указателем, полученным при более раннем вызове allocate(). Аргумент n должен быть равен первому аргументу вызова allocate (), который изначально породил p; в противном случае поведение не определено.