On 2015-02-26 21:50:55 +0000, Andrei Alexandrescu said:
http://wiki.dlang.org/DIP74 got to reviewable form. Please destroy and discuss.
Looks good in general.
Somehow I can't help but think how overloading new and delete would be
useful in combination with this. You know, this feature from D1 that
was deprecated for some reason (but still work fine as far as I know)?
http://digitalmars.com/d/1.0/class.html#allocators
class MyRCObject
{
new(size_t size) { return malloc(size); }
delete(void* ptr) { free(ptr); }
private size_t refs = 1;
void opAddRef() { ++refs; }
void opRelease() { if (--refs == 0) delete this; }
}
This way the user doesn't have to check the documentation for the
correct way to allocate this class, `new` will "just work":
auto obj = new MyRCObject;
It's not like the user really has any choice in how to allocate the
object anyway: implicit calls to `opRelease` will make sure things
break if you use a different allocation method than what it expects.
- - -
In your example with a payload, I think it is bad style to free the
payload in opRelease. I understand you can't free the payload in the
destructor to account for the case the destructor is called by the GC,
but that pattern won't work if you create a class derived from Widget
adding another similar payload. Just saying.
--
Michel Fortin
[email protected]
http://michelf.com/