Call destructor directly.

Agustin agustin.l.alvarez at hotmail.com
Sun Oct 20 22:59:06 PDT 2013


On Monday, 21 October 2013 at 05:40:13 UTC, Agustin wrote:
> On Monday, 21 October 2013 at 05:17:01 UTC, Jonathan M Davis 
> wrote:
>> On Monday, October 21, 2013 05:53:46 Agustin wrote:
>>> On Monday, 21 October 2013 at 03:50:24 UTC, Agustin wrote:
>>> > On Monday, 21 October 2013 at 03:46:33 UTC, Jonathan M Davis
>>> > 
>>> > wrote:
>>> >> On Monday, October 21, 2013 05:07:02 Agustin wrote:
>>> >>> What about constructor?. My current code is:
>>> >>> 	T allocate(T : Object, A...)(auto ref A arguments) {
>>> >>> 	
>>> >>> 		auto pMemory = rawAllocate(__traits(classInstanceSize, 
>>> >>> T),
>>> >>> 
>>> >>> T.alignof); // Return void*
>>> >>> 
>>> >>> 		emplace!T(cast(T *)pMemory, arguments);
>>> >>> 		return cast(T) pMemory;
>>> >>> 	
>>> >>> 	}
>>> >>> 
>>> >>> Doesn't seems to work, and i can't find any good 
>>> >>> documentation
>>> >>> about it.
>>> >> 
>>> >> IIRC, the constructor should be name __ctor.
>>> >> 
>>> >> - Jonathan M Davis
>>> > 
>>> > no property 'opCall' for type 'Main.MyClass' :(
>>> 
>>> Trait allMember return "__ctor", but seems like i cannot call 
>>> it
>>> directly:
>>> 
>>> (cast(T)pMemory).__ctor(arguments); // Being pMemory void*
>>
>> If you want to see how to use emplace, I'd advise looking at
>> std.typecons.RefCounted's implementation:
>>
>> https://github.com/D-Programming-Language/phobos/blob/master/std/typecons.d#L3505
>>
>> emplace calls the constructor for you, so I don't know why 
>> you'd be trying to
>> call it. But you can look at emplace's implementation if you 
>> want to see how
>> to call __ctor.
>>
>> For structs:
>> https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L3976
>>
>> For classes:
>> https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L4716
>>
>> I don't think that it'll work if the constructor is private 
>> though, so maybe
>> that's your problem.
>>
>> - Jonathan M Davis
>
> I'm silly the issue was at this line
>
> 		auto pMemory = rawAllocate(__traits(classInstanceSize, T), 
> T.alignof);
>
> 		emplace(pMemory, arguments);
>
> Correct was
>
> 		auto pMemory = rawAllocate(__traits(classInstanceSize, T), 
> T.alignof);
>
> 		emplace(&pMemory, arguments);
>
> Thanks guys

That didn't work, but after reading how emplace works, i had to 
make some changes.

	public T allocate(T : Object, A...)(auto ref A arguments) {
		auto pMemory = rawAllocate(__traits(classInstanceSize, T), 
T.alignof);
		assert(pMemory !is null, "Not enought memory on the allocator");

		byte[] * pByteMemory = cast(byte[] *) pMemory;
		*pByteMemory = typeid(T).init[];

		auto pObject = cast(T) pMemory;
		static if (is(typeof(pObject.__ctor(arguments))))
		{
			pObject.__ctor(arguments);
		}
		return pObject;
	}

That would work.


More information about the Digitalmars-d-learn mailing list