Подтвердить что ты не робот

Что означает "новое (& переменное) значение"; в С++ делать?

Скажем, у меня есть следующий код в программе на С++:

Object a = Object(someParameters);
new (&a) Object(someOtherParameters);

Мое предположение заключается в том, что он заменяет содержимое a на Object(someOtherParameters), избегая возможного operator=, объявленного для Object. Правильно ли это?

4b9b3361

Ответ 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.

Ответ 2

Он известен как размещение new: он создает новый Object по адресу, указанному внутри круглых скобок. Размещение new обычно используется для создания объекта в необработанной памяти. Построение нового объекта поверх существующего, как это делает код, является плохой идеей, потому что он не вызывает деструктор на исходном объекте.