Это заключена в цикле:Я не думаю, что это кастинг, но что это?
v[i] = new (&vv[i]) vertex(pts[i],i);
vertex
являетсяstruct
pts
являетсяpoint*
v
являетсяvertex**
vv
являетсяvertex*
Что делает часть (&vv[i])
?
Это заключена в цикле:Я не думаю, что это кастинг, но что это?
v[i] = new (&vv[i]) vertex(pts[i],i);
vertex
является struct
pts
является point*
v
является vertex**
vv
является vertex*
Что делает часть (&vv[i])
?
Похоже, место размещения новое. Это то же самое, что и обычный оператор new
, но вместо фактического выделения памяти он использует уже имеющуюся память и на которую указывает выражение внутри круглых скобок.
В вашем случае она использует память в vv[i]
, чтобы создать новый объект vertex
, а затем возвращает указатель на что (т.е. &vv[i]
) и он назначен v[i]
.
См., Например, this reference для более подробной информации.
Исправить. Заметьте, что «размещение нового» имеет значение в стандарте, что более инклюзивно, чем просто «вызов ctor на этот бит памяти». – MSalters
Кроме того, использование ' delete 'для этого места размещения является своеобразным. Вы можете видеть, что он делает явный вызов деструктора. –
'& vv [i]' должен быть эквивалентен 'vv + i', правильно? – Graznarak
Он строит новый объект в уже выделенной памяти - по адресу vv[i]
.
Это называют это allocation function:
operator new(std::size_t, void*);
// ^^^^
// &vv[i] is passed here
, который просто возвращает второй аргумент. Затем строится конструктор vertex
, который соответствует количеству аргументов их типов, чтобы построить объект на месте.
Это место размещения новое, что позволяет размещать объект в указанной ячейке памяти. См. http://www.parashift.com/c++-faq/placement-new.html и What uses are there for "placement new"?.
Да, это место размещения новое, оно выделяет адрес, в котором находится новый объект. Если ваш (& vv [i]) равен 0xabcdef00, ваш новый объект будет в 0xabcdef00, более detial вы можете проверить стандарт C++ 5.3.4.
Просьба описать четко –