Волшебство в размещении новое?
-
20-09-2019 - |
Вопрос
Я играю с динамическим распределением памяти «вручную», и я хотел посмотреть, как новое место реализуется парнями из MS, но когда отладка я «вступил в», это переместило меня в код:
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
Может ли кто -нибудь объяснить мне, как, черт возьми, этот код ставит мой объект на место, указанный на мой указатель, когда все, что я могу видеть в этом коде, - это линейность с оператором возврата с тем, что я предоставил в качестве аргумента. Я не думаю, что в комментариях в комментариях, что я хотел бы сделать, на самом деле достаточно, чтобы его сработало. Спасибо за любые конструктивные ответы.
Решение
Цель operator new
только для того, чтобы распределить память для объекта и вернуть указатель на эту память. Когда вы используете новое размещение, вы, по сути, говорите компилятору: «Я знаю, что эта память хороша, распределение пропуска и используете этот указатель для моего объекта». Затем конструктор вашего объекта называется с помощью указателя, предоставленного operator new
Была ли это память, которая была просто распределена или указана с использованием нового размещения. operator new
Сама не имеет никакого отношения к тому, как построен ваш объект.
Другие советы
Имейте в виду, что что new T(...)
(называется «новая экспрессия»)-это две вещи: распределение памяти и инициализация объекта. Вы можете настроить инициализацию, написав конструкторы. Для распределения вы пишете operator new
. Анкет Итак, несмотря на имя, operator new
делает только одну сторону того, что делает новое выражение.
Размещение новое, чтобы поместить объект в предварительно выделенную память. Вы не можете вызвать конструкторы, непосредственно проходя предварительно выделенную память как this
указатель. Единственное, что вы можете сделать, это использовать новое размещение: это превращает распределение в нетопе, оставляя только строительную конструкцию. Этот
inline void* operator new(size_t, void *p) throw()
{
return p;
}
это просто реализация этого NO-OP.