Когда вы используете размещение-новый, это общая причина (единственная причина?):
struct foo {};
void* memoryLocation = ::operator new(sizeof(foo));
foo* f = new (memoryLocation) foo(); // note: not safe, doesn't handle exceptions
// ...
f->~foo();
::operator delete(memoryLocation);
Это в основном присутствует в распределителях (используемых контейнерами), в функциях construct
и destroy
соответственно.
В противном случае не надо. Распределение стеков будет производиться автоматически, как и при указании delete
. (Используйте умные указатели!)
Ну, я полагаю, это делает еще одну причину: когда вам нужно неопределенное поведение. Тогда не стесняйтесь называть это столько раз, сколько хотите ... :)