#include #include #include struct Ticket { static int alive; Ticket() { ++alive; } ~Ticket() noexcept { --alive; } Ticket(const Ticket&) = delete; Ticket& operator=(const Ticket&) = delete; }; int Ticket::alive = 0; std::unique_ptr make_ticket(bool valid) { auto result = std::make_unique(); if (!valid) throw std::invalid_argument("invalid ticket"); return result; } int main() { bool caught = false; try { auto ticket = make_ticket(false); } catch (const std::invalid_argument&) { caught = true; } assert(caught && Ticket::alive == 0); { auto ticket = make_ticket(true); assert(Ticket::alive == 1); } assert(Ticket::alive == 0); }