2009-11-13 2 views
3

Я играю с динамическим распределением памяти «вручную», и я хотел бы увидеть, как размещение нового реализуется ребята из MS, но при отладке я «вошел в» переехал меня код:Магия в размещении новых?

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() 
{ // construct array with placement at _Where 
return (_Where); 
} 
МОГ

кто-нибудь объяснит мне, как на земле этот код помещает мой объект в место, указанную моим указателем, когда все, что я вижу в этом коде, - это строка с оператором return с тем, что я поставил в качестве аргумента. Я не думаю, что говорить в комментарии, что я хотел бы, чтобы этот fnc делать, на самом деле достаточно, чтобы он работал. Благодарим за конструктивные ответы.

ответ

13

Цель operator new состоит только в том, чтобы выделить память для объекта и вернуть указатель на эту память. Когда вы используете новое место размещения, вы, по сути, говорите компилятору «Я знаю, что эта память хороша, пропускает выделение и использует этот указатель для моего объекта». Конструктор вашего объекта затем вызывается с помощью указателя, предоставленного operator new, независимо от того, была ли это просто выделенная память или указана с помощью размещения new. operator new сам по себе не имеет никакого отношения к тому, как строится ваш объект.

+0

Это означает, что вам лучше позаботиться о том, чтобы было достаточно места для размещения переданного 'size_t', иначе у вас будут проблемы ... –

5

Имейте в виду, что то, что делает new T(...) (называемое «новое выражение»), - это две вещи: выделение памяти и инициализация объекта. Вы можете настроить инициализацию, написав конструкторы. Для выделения вы пишете operator new. Поэтому, несмотря на название, operator new делает только одну сторону того, что делает новое выражение.

Размещение новое есть, чтобы поместить объект в предварительно выделенную память. Вы не можете вызвать конструкторы, напрямую передающие предварительно выделенную память как указатель this. Единственное, что вы можете сделать, это использовать новое размещение: это превращает выделение в no-op, оставляя только оставшуюся конструкцию. Это

inline void* operator new(size_t, void *p) throw() 
{ 
    return p; 
} 

- это просто реализация этого не-op.

+0

@ sbi :: как сделать место размещения новым для массивов? Пожалуйста, напишите мой код [link] (http://ideone.com/Yjc6y) – Atul

+0

@Atul: Я не уверен, что понимаю ваш код. Во всяком случае, вы делаете это, чтобы создать отдельные элементы массива в достаточно большом блоке памяти. Тем не менее, 'std :: vector' делает именно это и имеет множество колоколов и свистов. Плюс гораздо менее вероятно, что это будет ошибкой, чем ваш собственный код. Так почему бы вам просто не использовать его? – sbi

Смежные вопросы