Throwing InvalidMemoryOperationError

Adam D. Ruppe via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 4 09:49:06 PDT 2015


On Thursday, 4 June 2015 at 16:32:39 UTC, Etienne Cimon wrote:
> Wouldn't that be with `this() in { assert() }` ?

Not necessarily. Consider something like a file wrapper, if fopen 
is null inside the ctor, you'd generally throw on that.

> My concern is the fact that the destructor won't be called. Or 
> will it?

It won't be for deterministic objects (structs on the stack) but 
is for GC'd objects (eventually).

I don't think it should be called since if the constructor fails, 
the object doesn't really exist and there's nothing to destroy. 
You can reliably clean up intermediate things in a constructor 
using scope(failure):

struct Foo {
    FILE* file, file2;
    this(something somename) {
         file = fopen(somename);
         if(file is null) throw FileException(somename);
         scope(failure) { fclose(file); file = null; }
         file2 = fopen(somename2);
         if(file2 is null) throw FileException(somename2);
    }
    ~this() {
       if(file !is null) fclose(file);
       if(file2 !is null) fclose(file2);
    }
}



That'd work whether the destructor is called automatically or not 
and isn't too hard to write since scope(failure) is pretty 
convenient.


More information about the Digitalmars-d mailing list