www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - scope and raising from constructor

reply Paolo Invernizzi <arathorn fastwebnet.it> writes:
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
parent "Denis Koroskin" <2korden gmail.com> writes:
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