Я понимаю, что это опрометчиво, и я не предлагаю, чтобы сделать это, но мне интересно, является ли следующее фактически формально незаконны:Ручно имитирует влияние оператора delete на C++ формально незаконным?
#include <iostream>
struct X
{
~X()
{
std::cout << "~X()\n";
}
};
int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}
Это мое понимание того, что delete x;
эквивалентно вызывая деструктор, а затем вызывая ::operator delete(x);
, но разве это законно для меня делать это вручную в соответствии со стандартом? Я знаю, что это правильная вещь при использовании нового места размещения, но как насчет случая без места размещения? Моя догадка в том, что это может быть незаконно, потому что delete
(а не operator delete
) должно выполняться для каждого new
, но мне было бы интересно узнать наверняка.
Вы спрашиваете, является ли 'delete x;' эквивалентным вызову деструктора, а затем 'operator delete (x);' для * данного конкретного примера кода * или * вообще *? –
@Ben: В этом конкретном примере кода - но меня также интересует общий случай (для которого я теперь предполагаю, что ответ отрицательный). –
Рад, что я задал этот вопрос - на самом деле есть гораздо больше ответа, чем я представлял. –