Ответ 1
Он назвал размещение нового. Он вызывает конструктор в указанной памяти, а не выделяет новую память. Обратите внимание, что в этом случае вы должны явно вызвать деструктор вашего объекта, прежде чем освобождать выделенную память.
Разъяснение. Предположим, вы выделили некоторую необработанную память
char * rawMemory = new char [sizeof (Object)];
и вы хотите построить объект в этой памяти. Вы вызываете
new(rawMemory) Object(params);
Теперь, прежде чем освободить память
delete [] rawMemory;
вам нужно будет вызвать derstuctor объекта явно
reinterpret_cast<Object*>(rawMemory)->~Object();
В вашем конкретном примере, однако, потенциальная проблема заключается в том, что вы неправильно уничтожили существующий объект до создания нового в своей памяти.
Bonus:
Вы когда-нибудь задавались вопросом, как стандартный std::vector
может обойтись без того, чтобы содержащиеся в нем объекты были по умолчанию конструктивными? Причина в том, что для большинства, если не для всех, реализаций allocator<T>
не хранит T* p
, для чего T будет конструктивным по умолчанию в случае p = new T[N]
. Вместо этого он хранит указатель char
- необработанную память и выделяет p = new char[N*sizeof(T)]
. Когда вы push_back
объект, он просто вызывает конструктор копирования с новым местом размещения на соответствующем адресе в этом массиве char.