[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]


return_test.zip