2014-01-07 4 views

ответ

2

Это является примером placement new, где контейнер представляет собой начальный адрес объекта t, созданного с типом T

Пример кода создает объект типа T с помощью конструктора копирования, который принимает параметр Type T и помещает объект в ячейку памяти объекта t.

Просто понять эту идею, рассмотрит тип как целое, так что ваш код шаблона будет выглядеть

int t; 
new (&t) int(t); 

Таким образом, очевидно, размещение нового является избыточным и запутанным. Единственной причиной написания такого нечетного кода может быть принудительно инициализировать объект с помощью Copy Constructor, который может иметь некоторый дополнительный код, кроме копирования содержимого объекта, который может быть интересен пользователю..

+0

В частности, это никогда не должно выполняться, если тип тривиально разрушаем. – Mehrdad

4

Это называется синтаксисом «размещение нового». Значение T построено по адресу, указанному &t.

Этот образец немного выключен, так как он создает новый T в точном расположении существующего T, используя конструктор копирования. Я думаю, что проще объяснить эту концепцию явным адресом. Вот вариант этого кода.

T t; 
void* pAddress = malloc(sizeof(T)); 
new (pAddress) T(t); 

// Or just creating a T without a copy ctor 
new (pAddress) T(); 
+0

Следует также отметить, что '' new (pAddress) T; '' равнозначен, '' T (t) '' вместо '' T'' является чисто для вызова конструктора копирования вместо конструктора по умолчанию. –

+0

Мне любопытно, действительно ли пример OPs фактически работает на практике? Не следует ли в какой-то момент вызвать деструктор исходного '' T'' на '' t''? Но когда? Либо его вызывается перед построением копии, что означает, что вы больше не можете копировать, либо его вызвали после, но затем объект уже перезаписан ... –

+0

@ DiederickC.Niehorster Похоже, деструктор не называется: http://ideone.com/ lf3fx1 – tecu

2

Это Placement Syntax; Это Постулаты:

new (&t) T(t); 

Создает объект производится по адресу t&t(), но она не выделяет память.

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