Call destructor directly.

Agustin agustin.l.alvarez at hotmail.com
Sun Oct 20 22:39:54 PDT 2013


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


More information about the Digitalmars-d-learn mailing list