The function f1 creates an instance of foo and sets foo.ptr[0] = 2.
#include <iostream>
using namespace std;
class foo {
public:
        int *ptr;
        inline foo(int a) {
                ptr = new int[a];
        }
        inline ~foo() {
                delete[] ptr;
        }
};
foo f1() {
        foo a(5);
        a.ptr[0] = 2;
        return a;
}
int main() {
        foo a = f1();
        cout<<a.ptr[0]<<endl;
        return 0;
}
What I expected as the output: junk value.
f1 returns by value, which means a copy of a is made and this copy even shares the same memory locations at which their (a and it's copy) respective ptrs point at.
Outside f1, a gets destroyed.
It's destructor is called which will deallocate ptr's memory. This means the memory location which the copy's ptr points at is also invalid. So, I expect a junk value as output. 
The output actually is 2.
Why?
 
    