I have made a discovery

Rikki Cattermole via Digitalmars-d digitalmars-d at puremagic.com
Sat Apr 18 19:24:04 PDT 2015


On 19/04/2015 1:52 p.m., Adam D. Ruppe wrote:
> On Sunday, 19 April 2015 at 01:19:47 UTC, Brian Schott wrote:
>> If you overload a class's `new`, you are deciding for your class's
>> user how it will be allocated.
>
>
> Without telling them btw. (Well, except the documentation or the
> source.) So now, they new it and expect the GC to clean it up like any
> other class.... but that invisibly doesn't happen.
>
> Overriding new was totally a misfeature in D and it should go away.
>
>
> BTW having new in the language at all I wish wasn't a thing. Perhaps it
> was right back in old D1, but not ideal in D2, where we can easily
> define a template to do it - which could be easily swapped out at the
> usage point and enable all kinds of nice things.
>
> Of course, we can still define library New!T (and indeed, I think we
> should), but the keyword will always have a bit of a brainspace edge
> over it...

auto adding(int x, int y) {
	int[3] values = allocate!(int[3]);

	values[0] = x;
	values[1] = y;
	values[2] = x + y;

	return values;
}

...

auto adding(int x, int y) {
	int[3] values = new!(int[3]);

	values[0] = x;
	values[1] = y;
	values[2] = x + y;

	return values;
}

...

auto adding(int x, int y) {
	int[3] values = new int[](3);

	values[0] = x;
	values[1] = y;
	values[2] = x + y;

	return values;
}

...

struct MyAllocator {
	T* opAllocate(T)(){
		T* value;

		// alloc

		value.rtInfo.fromGC = false;
		value.rtInfo.isRefCounted = false;
		value.rtInfo.isGCFree = true; // allows GC to free it
		value.rtInfo.freeFunction = &opFree; // maybe?

		return value;
	}

	void opFree(T)(T*){
		// free
	}
}

new(MyAllocator):

auto adding(int x, int y) {
	int[3] values = new int[](3);

	values[0] = x;
	values[1] = y;
	values[2] = x + y;

	return values;
}

...

I'm not totally sold.


More information about the Digitalmars-d mailing list