DIP44: scope(class) and scope(struct)

Tobias Pankrath tobias at pankrath.net
Sat Aug 24 15:18:27 PDT 2013


On Saturday, 24 August 2013 at 20:11:14 UTC, H. S. Teoh wrote:
> How would you use RAII to solve this problem? If I have a class:
>
> 	class C {
> 		Resource1 res1;
> 		Resource2 res2;
> 		Resource3 res3;
> 		this() {
> 			...
> 		}
> 	}
>
> How would you write the ctor with RAII such that if it 
> successfully
> inits res1 and res2, but throws before it inits res3, then only 
> res1 and
> res2 will be cleaned up?

Like someone else already proposed: Using a wrapper type W that 
releases the resources in it's destructor. W.init wouldn't 
release anything. So by definition (if I recall the rules 
correctly) every new instance of C would have res3 = 
Resource3.init prior to it's constructor called.

Now make sure that a) res3's destructor gets called (check) b) 
res3's destructor may be called on Resource3.init. That would be 
a new rule similar to 'no internal aliasing' and c) that every 
constructor of C either sets res3 to a destructable value or does 
not touch it at all ('transactional programming').









More information about the Digitalmars-d mailing list