Order of Object destruction
Neophytos Michael
nmichael@cs.princeton.edu
Fri May 23 12:34:00 GMT 2003
Eljay Love-Jensen wrote:
> Hi Neophytos,
>
> Yes, the order of destruction is specified, due in no small part to the
> lifespan of a temporary being well-defined.
>
> Effectively, the temporary object lives until the end-of-statement
> semicolon.
>
> As I understand it (I've never needed to tried this), if there were an
> alias to it, it would live until the end of the extant of alias. For
> example:
> A a;
> A& b = foo(a);
> // a and b are live.
> cout << a.y << endl;
> cout << b.y << endl; // Okay.
>
> Before the standard's committee nailed the issue, compiler vendors were
> inconsistent when the temporary object was destructed. Which lead to
> all sorts of non-portable code and frustrated programmers.
>
> --Eljay
The example that you show I understand and it's fine. But the two
objects I was refering two was not "a" and "b" as you have above, but
"b" and the temprary object created by the copy constructor once
function foo is entered.
Look at the code again:
A foo(A z) {
cout << "In foo Object #: " << z.y << endl;
return z;
}
int main() {
A a;
cout << foo(a).y << endl;
return 0;
}
When the call foo(a) is made the copy constructor is called and makes a
new object "z". This object "z" is supposed to be desposed off when it
goes out of scope.
When the return happens in foo, the copy constructor is called again and
given "z" as an argument (a reference to "z") it creates a new object
(let's call it "b" as you did above). When "b" gets created there is no
reference to "z" anymore (and that's why I don't understand your example
above).
I was asking which was supposed to be desposed of first "z" or "b"?
Visual C++ disposes "z" first and then "b". g++ does the opposite.
Does the standard say which has to go first? If it does then one of the
two compilers is in error.
Thanks,
Neophytos
More information about the Gcc-help
mailing list