[Source]
MyInt foo() { MyInt a(1000); return a; } MyInt& ref_foo() { MyInt a(2000); return a; } MyInt* ptr_foo() { MyInt a(3000); return &a; } void foo_test() { printf("\n-------- foo test --------\n"); { MyInt b = foo(); // b <- copy(a) , destroy(a) b = 1001; } // destroy(b) printf("\n"); { MyInt& b = foo(); // b <- ref(a), ( destroy(a) -- GCC , invalid reference ) b = 1002; } // destroy(a) -- VS printf("\n"); { MyInt* b = &foo(); // destroy(a) , b <- ptr(a) (invalid pointer) *b = 1003; // invalid access(b) } } void ref_foo_test() { printf("\n-------- ref_foo test --------\n"); { MyInt b = ref_foo(); // destroy(a) , b <- copy(a) (invalid copy) b = 2001; } // destroy(b) printf("\n"); { MyInt& b = ref_foo(); // destroy(a) , b <- ref(a) (invalid reference) b = 2002; // invalid access(b) } printf("\n"); { MyInt* b = &ref_foo(); // destroy(a) , b <- ptr(a) (invalid pointer) *b = 2003; // invalid access(b) } } void ptr_foo_test() { printf("\n-------- ptr_foo test --------\n"); { MyInt b = *ptr_foo(); // destroy(a), b <- copy(a) (invalid copy) b = 3001; } // destroy(b) printf("\n"); { MyInt& b = *ptr_foo(); // destroy(a), b <- ref(a) (invalid reference) b = 3002; // invalid access(b) } printf("\n"); { MyInt* b = ptr_foo(); // destroy(a), b <- ptr(a) (invalid pointer) *b = 3003; // invalid access(b) } } int main() { foo_test(); ref_foo_test(); ptr_foo_test(); }
[Output]
-------- foo test --------
001EFBE8 MyInt::MyInt(int 1000)
001EFBE8 MyInt(1000)::= (int 1001)
001EFBE8 MyInt::~MyInt() 1001
001EFBE8 MyInt::MyInt(int 1000)
001EFBE8 MyInt(1000)::= (int 1002)
001EFBE8 MyInt::~MyInt() 1002
001EFBF0 MyInt::MyInt(int 1000)
001EFBF0 MyInt::~MyInt() 1000
001EFBF0 MyInt(1000)::= (int 1003)
-------- ref_foo test --------
001EFBF0 MyInt::MyInt(int 2000)
001EFBF0 MyInt::~MyInt() 2000
001EFBE0 MyInt::MyInt(MyInt& 2000)
001EFBE0 MyInt(2000)::= (int 2001)
001EFBE0 MyInt::~MyInt() 2001
001EFBE0 MyInt::MyInt(int 2000)
001EFBE0 MyInt::~MyInt() 2000
001EFBE0 MyInt(2000)::= (int 2002)
001EFBE8 MyInt::MyInt(int 2000)
001EFBE8 MyInt::~MyInt() 2000
001EFBE8 MyInt(2000)::= (int 2003)
-------- ptr_foo test --------
001EFBF0 MyInt::MyInt(int 3000)
001EFBF0 MyInt::~MyInt() 3000
001EFBE0 MyInt::MyInt(MyInt& 3000)
001EFBE0 MyInt(3000)::= (int 3001)
001EFBE0 MyInt::~MyInt() 3001
001EFBE0 MyInt::MyInt(int 3000)
001EFBE0 MyInt::~MyInt() 3000
001EFBE0 MyInt(3000)::= (int 3002)
001EFBE8 MyInt::MyInt(int 3000)
001EFBE8 MyInt::~MyInt() 3000
001EFBE8 MyInt(3000)::= (int 3003)
[Download]