Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Инициализация неинициализированной памяти в аллокаторах

#cpp


При инициализации неинициализированной памяти в аллокаторах (например, в функции
uninitialized_fill) используют placement new такого вида ::new (static_cast(&*buf))T(value),
где buf - уже выделенный участок памяти, T(value) - вызов конструктора.


Для чего нужен static_cast(...)?
Для чего нужно &*buf?

    


Ответы

Ответ 1



Для чего нужен static_cast(...)? Приведение к void* нужно, чтобы исключить возможность вызова пользовательского размещающего new. Пример: #include struct A { }; void* operator new(std::size_t, A* a) { std::cout << "user new\n"; return a; } int main() { A* p = static_cast( malloc(sizeof(A)) ); new (static_cast(p)) A; // built-in new (p) A; // user-defined } Для чего нужно &*buf? Т.к. buf это в общем случае, не просто голый указатель, а итератор, то пара &* используется для получения адреса (голого указателя). В более правильном варианте эта конструкция будет выглядеть и вовсе как: std::addressof(*buf)) Использование std::addressof необходимо по причине того, что operator& может быть перегружен для типа *buf.

Комментариев нет:

Отправить комментарий