Что такое значение для & t для выражения new (& t) T (t) в C++?Что такое значение для & t для выражения new (& t) T (t) в C++?
под названием.
T t;
new (&t) T(t);
Что такое значение для & t для выражения new (& t) T (t) в C++?Что такое значение для & t для выражения new (& t) T (t) в C++?
под названием.
T t;
new (&t) T(t);
Это является примером placement new, где контейнер представляет собой начальный адрес объекта t
, созданного с типом T
Пример кода создает объект типа T
с помощью конструктора копирования, который принимает параметр Type T
и помещает объект в ячейку памяти объекта t
.
Просто понять эту идею, рассмотрит тип как целое, так что ваш код шаблона будет выглядеть
int t;
new (&t) int(t);
Таким образом, очевидно, размещение нового является избыточным и запутанным. Единственной причиной написания такого нечетного кода может быть принудительно инициализировать объект с помощью Copy Constructor, который может иметь некоторый дополнительный код, кроме копирования содержимого объекта, который может быть интересен пользователю..
Это называется синтаксисом «размещение нового». Значение 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();
Следует также отметить, что '' new (pAddress) T; '' равнозначен, '' T (t) '' вместо '' T'' является чисто для вызова конструктора копирования вместо конструктора по умолчанию. –
Мне любопытно, действительно ли пример OPs фактически работает на практике? Не следует ли в какой-то момент вызвать деструктор исходного '' T'' на '' t''? Но когда? Либо его вызывается перед построением копии, что означает, что вы больше не можете копировать, либо его вызвали после, но затем объект уже перезаписан ... –
@ DiederickC.Niehorster Похоже, деструктор не называется: http://ideone.com/ lf3fx1 – tecu
Это Placement Syntax
; Это Постулаты:
new (&t) T(t);
Создает объект производится по адресу t
&t
(), но она не выделяет память.
В частности, это никогда не должно выполняться, если тип тривиально разрушаем. – Mehrdad