scope attribute and catching exception

Paolo Invernizzi arathorn at fastwebnet.it
Mon Oct 13 05:03:32 PDT 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!
    }
}




More information about the Digitalmars-d-learn mailing list