Вопрос

Я играю с динамическим распределением памяти «вручную», и я хотел посмотреть, как новое место реализуется парнями из 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top