Afficher un message
Vieux 29/06/2008, 20h55   #6
Erik Wikström
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Basic question C++ exception

On 2008-06-29 20:28, Vijay wrote:
> On Jun 29, 12:41 pm, Erik Wikström <Erik-wikst...@telia.com> wrote:
>> On 2008-06-29 17:34, Vijay wrote:


>> > Question 2.

>>
>> > class A
>> > {
>> > public:
>> > A(){cout<<"In Constructor\n";}
>> > A(const A&){cout<<"In Copy Constructor\n";}
>> > ~A(){cout<<"In Destructor\n";}
>> > };
>> > try{
>> > cout<<"In Try\n";
>> > throw A();
>> > }
>> > catch(A a)
>> > {
>> > cout<<"In Catch\n";
>> > }
>> > output:
>> > In Try;
>> > In Constructor
>> > In Copy Constructor
>> > In Catch
>> > In Destructor
>> > In Destructor

>>
>> > Why object created by throw A() has not been deleted while exiting try
>> > block in above code?

>>
>> The object created by thow can not be destroyes before it has been used
>> to initialise the object in the exception-handler (the extra copy has
>> been eliminated). It will also live until the last exception handler has
>> run (if the object is destroyed and you re-throw what would happen
>> then?), so it is the last destructor to run.
>>
>> If I comment out the copy-constructor my compiler does not optimise away
>> the extra copy and I get the following result:
>>
>> In Try
>> In Constructor // throw A(), followed by a copy-constructor
>> In Destructor // The object created by A() is destroyed
>> In Catch // a in the catch(A a) is copy-constructed first
>> In Destructor // The object created in the handler is destroyes
>> In Destructor // The exception object dies

>
> Thanks. I think, because of compiler optimization, i am getting
> confused.
> one more point: in your above result, i didnt get two lines
> In Destructor // The object created by A() is destroyed
> and
> In Destructor // The exception object dies
>
> object created by A() is exception object. right?
> If no, then when exception object is created which dies in last line?


No, the exception object is a copy of the object created by A(), unless
the compiler uses the optimisation, in which case the exception-object
and the object created by A() is the same (and in that case it will no
be destroyed until the end of the exception-handler).

--
Erik Wikström
  Réponse avec citation
 
Page generated in 0,06754 seconds with 9 queries