digitalmars.D.learn - scope attribute and catching exception
- Paolo Invernizzi (29/29) Oct 13 2008 Hi all,
- Denis Koroskin (4/31) Oct 13 2008 Looks like no destructor is called if ctor throws an exception.
- Paolo Invernizzi (12/14) Oct 13 2008 In that case everything is ok. So it's a bug?
- Max Samukha (16/45) Oct 13 2008 because r2 wasn't successfully created and there is nothing to call
- Paolo Invernizzi (47/49) Oct 13 2008 I think is more complicated... see this:
- Max Samukha (4/53) Oct 13 2008 I think this is a bug.
Hi all,
Someone can explain me why the scope attribute of r2 is not satisfied? It's a
bug or an expected behaviour?
Paolo
module tests.d.scopes.t02.test;
class Resource {
static int allocated = 0;
this( bool mustThrow = false ){
allocated ++;
if( mustThrow ) throw new Exception("bang");
}
~this(){
allocated --;
}
}
void main(){
// Why the destructor of r2 is not called when exiting the scope?
{
try {
scope r1 = new Resource();
scope r2 = new Resource(true);
}
catch(Exception e){}
}
//assert( Resource.allocated == 0); // Expected
assert( Resource.allocated == 1 ); // What's happening
}
Oct 13 2008
On Mon, 13 Oct 2008 13:50:46 +0400, Paolo Invernizzi
<arathorn fastwebnet.it> wrote:
Hi all,
Someone can explain me why the scope attribute of r2 is not satisfied?
It's a bug or an expected behaviour?
Paolo
module tests.d.scopes.t02.test;
class Resource {
static int allocated = 0;
this( bool mustThrow = false ){
allocated ++;
if( mustThrow ) throw new Exception("bang");
}
~this(){
allocated --;
}
}
void main(){
// Why the destructor of r2 is not called when exiting the scope?
{
try {
scope r1 = new Resource();
scope r2 = new Resource(true);
}
catch(Exception e){}
}
//assert( Resource.allocated == 0); // Expected
assert( Resource.allocated == 1 ); // What's happening
}
Looks like no destructor is called if ctor throws an exception.
Try throwing outside of it and see what happens.
Oct 13 2008
Denis Koroskin Wrote:Looks like no destructor is called if ctor throws an exception. Try throwing outside of it and see what happens.In that case everything is ok. So it's a bug? // In this case everything it's ok { try { scope r1 = new Resource(); scope r2 = new Resource(); throw new Exception("bang"); } catch(Exception e){} } assert( Resource.allocated == 0); // Expected
Oct 13 2008
On Mon, 13 Oct 2008 05:50:46 -0400, Paolo Invernizzi
<arathorn fastwebnet.it> wrote:
Hi all,
Someone can explain me why the scope attribute of r2 is not satisfied? It's a
bug or an expected behaviour?
Paolo
module tests.d.scopes.t02.test;
class Resource {
static int allocated = 0;
this( bool mustThrow = false ){
allocated ++;
if( mustThrow ) throw new Exception("bang");
}
~this(){
allocated --;
}
}
void main(){
// Why the destructor of r2 is not called when exiting the scope?
{
try {
scope r1 = new Resource();
scope r2 = new Resource(true);
}
catch(Exception e){}
}
//assert( Resource.allocated == 0); // Expected
assert( Resource.allocated == 1 ); // What's happening
}
because r2 wasn't successfully created and there is nothing to call
the destructor on:
class Resource {
static int allocated = 0;
this( bool mustThrow = false )
{
scope(success)
allocated++;
if( mustThrow ) throw new Exception("bang");
}
~this(){
allocated --;
}
}
Oct 13 2008
Max Samukha Wrote:because r2 wasn't successfully created and there is nothing to call the destructor on:I think is more complicated... see this: module tests.d.scopes.t02.test; class Resource { static int allocated = 0; this( bool mustThrow = false ){ allocated ++; if( mustThrow ) throw new Exception("bang"); } ~this(){ allocated --; } } class Factory { Resource resource(bool b=false){ return new Resource(b); } } import std.gc, std.stdio; void main(){ // In this case everything it's ok { try { scope r1 = new Resource(true); assert( false ); } catch(Exception e){} assert( Resource.allocated == 1); std.gc.fullCollect(); assert( Resource.allocated == 1 ); } Resource.allocated = 0; // In this case the destructor IS called, only on collect... { auto f = new Factory(); try { scope r1 = f.resource(true); assert( false ); } catch(Exception e){} assert( Resource.allocated == 1); std.gc.fullCollect(); assert( Resource.allocated == 0 ); // Dho! Destructor called! } }
Oct 13 2008
On Mon, 13 Oct 2008 08:03:32 -0400, Paolo Invernizzi <arathorn fastwebnet.it> wrote:Max Samukha Wrote:I think this is a bug.because r2 wasn't successfully created and there is nothing to call the destructor on:I think is more complicated... see this: module tests.d.scopes.t02.test; class Resource { static int allocated = 0; this( bool mustThrow = false ){ allocated ++; if( mustThrow ) throw new Exception("bang"); } ~this(){ allocated --; } } class Factory { Resource resource(bool b=false){ return new Resource(b); } } import std.gc, std.stdio; void main(){ // In this case everything it's ok { try { scope r1 = new Resource(true); assert( false ); } catch(Exception e){} assert( Resource.allocated == 1); std.gc.fullCollect(); assert( Resource.allocated == 1 ); } Resource.allocated = 0; // In this case the destructor IS called, only on collect... { auto f = new Factory(); try { scope r1 = f.resource(true); assert( false ); } catch(Exception e){} assert( Resource.allocated == 1); std.gc.fullCollect(); assert( Resource.allocated == 0 ); // Dho! Destructor called! } }
Oct 13 2008









Paolo Invernizzi <arathorn fastwebnet.it> 