W bieżącym standardzie C++ (C++ 14, jak również w poprzednich wersjach C++ 11 i C++ 03) nie określono, czy pamięć jest alokowana przed czy po ocenienie f()
, ale w dowolnym pamięć case zostanie zwolniona, jeśli została przydzielona; [expr.new]:
20 - Jeżeli część inicjalizacji przedmiotu opisanego powyżej kończy rzucając wyjątek składowanie uzyskano dla obiektu i odpowiedni może być funkcja dealokacji znalezione, funkcja dealokacji jest zwane zwolnienia pamięci [...]
79) może obejmować oceniania nową-inicjator i/lub wywołanie konstruktora.
Tutaj nowych inicjator jest f()
, więc jeżeli ocena f()
zgłasza wyjątek, funkcja dealokacji będzie nazywany (jeśli stwierdzono).
ponieważ C++ 17, przydział pamięci sekwencjonuje przed ocenę f()
tak pamięci zawsze zwalniane:
21 - Jeżeli część inicjalizacji przedmiotu opisanego powyżej kończy rzucając wyjątek i odpowiedniej funkcji dealokacji można znaleźć, funkcja dealokacji nazywa [...]
proszę zauważyć, że ponieważ MEMOR y alokacja jest elidable, implementacja jest w praktyce swobodny, aby pominąć przydział, jeśli można przewidzieć, że wyjątek zostanie rzucony.
Implementacja powinna zwolnić pamięć, która została przydzielona dla obiektu 'T'. –