I wrote some code that involves moving and changing variables in C++. Below is what I have wrote.
#include <iostream>
void six(int*& ptr) {
    int s = 6;
    ptr = &s;
}
int main() {
    int f = 5;
    int* ptr = &f;
    std::cout << *ptr << '\n';
    six(ptr);
    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }
    return 0;
}
so this prints:
5
6
I tried another code, adding a single line:
#include <iostream>
void six(int*& ptr) {
    int s = 6;
    ptr = &s;
    free(&s); // added line
}
int main() {
    int f = 5;
    int* ptr = &f;
    std::cout << *ptr << '\n';
    six(ptr);
    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }
    return 0;
}
Obviously, this gives an error after printing 5 because what the modified pointer is pointing is not available when called the second time.
However, I am confused at the first case. When calling six in the main function, variable s is not in the main scope, but the value itself still continues to remain in the memory to be referenced. Doesn't C++ automatically destroy variables and clean them when it goes out of the scope? Is this a memory leak?
 
    