// Muestra cuándo corre cada destructor.
#include <iostream>
#include <string>

class Noisy {
public:
    explicit Noisy(const std::string& name) : name_(name) {
        std::cout << "  crea " << name_ << "\n";
    }
    ~Noisy() {
        std::cout << "  destruye " << name_ << "\n";
    }

private:
    std::string name_;
};

int first_positive(int a, int b) {
    Noisy guard("guard");
    if (a > 0) {
        return a;
    }
    return b;
}

int main() {
    std::cout << "bloque:\n";
    {
        Noisy x("x");
        Noisy y("y");
        std::cout << "  fin del bloque\n";
    }
    std::cout << "retorno temprano:\n";
    int result = first_positive(5, 6);
    std::cout << "  resultado " << result << "\n";
    std::cout << "new y delete:\n";
    Noisy* z = new Noisy("z");
    std::cout << "  z sigue vivo\n";
    delete z;
    std::cout << "fin de main\n";
    return 0;
}
