Zdaję sobie sprawę, jest to niewskazane, a ja nie proponuje, aby to zrobić, ale jestem ciekaw, czy rzeczywiście następuje formalnie nielegalne:Czy ręczne symulowanie efektów operatora usuwania w C++ jest formalnie nielegalne?
#include <iostream>
struct X
{
~X()
{
std::cout << "~X()\n";
}
};
int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}
To moja zrozumienie, że delete x;
jest równoważna wywołanie destruktora, a następnie wywołanie ::operator delete(x);
, ale czy jest to zgodne z prawem, aby to zrobić ręcznie zgodnie ze standardem? Wiem, że jest to ważne, gdy korzystasz z nowego miejsca docelowego, ale co w przypadku bez umieszczania? Moje przeczucie jest takie, że może być nielegalne, ponieważ delete
(i nie operator delete
) musi być wykonane dla każdego new
, ale chciałbym wiedzieć na pewno.
czy pytasz, czy 'delete x;' jest równoważne wywołaniu destruktora, a następnie 'operator delete (x);' dla * tej konkretnej próbki kodu *, czy * ogólnie *? –
@Ben: W tym konkretnym przykładzie kodu - ale interesuje mnie również ogólny przypadek (na który teraz zakładam, że odpowiedź brzmi "nie"). –
Cieszę się, że zadałem to pytanie - w rzeczywistości jest o wiele więcej odpowiedzi, niż sobie wyobrażałem. –