digitalmars.D - scope and raising from constructor
- Paolo Invernizzi (49/49) Oct 14 2008 Hi all,
- Denis Koroskin (4/52) Oct 14 2008 I think there is no need to post it twice across different newsgroups,
Hi all, I've posted this on D learn, just to know: is it a bug? If yes, I'll post a ticket... If not, I don't understand the difference behaviour... Thanks, 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 --; } } 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 14 2008
On Tue, 14 Oct 2008 11:51:27 +0400, Paolo Invernizzi <arathorn fastwebnet.it> wrote:Hi all, I've posted this on D learn, just to know: is it a bug? If yes, I'll post a ticket... If not, I don't understand the difference behaviour... Thanks, 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 --; } } 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! } }I think there is no need to post it twice across different newsgroups, most of the people monitor all or none of them.
Oct 14 2008