Manually allocating a File

Chris M. chrismohrfeld at comcast.net
Tue Feb 20 15:32:45 UTC 2018


On Tuesday, 20 February 2018 at 15:18:11 UTC, Adam D. Ruppe wrote:
> On Tuesday, 20 February 2018 at 14:56:54 UTC, Chris M. wrote:
>> I'm doing this mainly for experimentation, but the following 
>> piece of code gives all sorts of errors.
>
> so important note: this will perform worse than the automatic 
> allocation, which just puts it down in-place. You should 
> basically never `new` or `malloc` a `File` struct. (in fact, i 
> think we should @disable new on it! yes, D can do that!)
>
>
>>     auto f = cast(File *) malloc(File.sizeof);
>>     *f = File("test.txt", "r");
>
> Two notes here: 1) it will call the destructor on *f, which is 
> uninitialized data and 2) the destructor that actually wants to 
> run will have to wait until the GC reaps it, which is also not 
> ideal. The segfault you see is in #2 here, though I'm not sure 
> exactly what is causing it, could be out-of-order, could be 
> some other corruption, idk.
>
> Generally, when manually allocating D objects, first malloc it, 
> then copy the `.init` value over, before casting it to the 
> other type - do all this as bytes so it doesn't trigger 
> postblits, destructors, etc like a real struct. The 
> `std.conv.emplace` function from phobos does this and its 
> source code can help you see how in a few cases.

Thanks for the info, that clears things up. Like I said, it was 
more experimentation rather than me planning to actually use it. 
Works now with the following modifications.

import std.stdio;
import core.stdc.stdlib;
import std.conv;

void main()
{
     auto f = cast(File*) malloc(File.sizeof);
     emplace!File(f, "test.txt", "r");
     f.readln.write;
     free(f);
}

>>     (*f).readln.writeln;
>
> That * is unnecessary btw, in D you can
>
> f.readln
>
> and it will see it is a pointer to struct and dereference it 
> for you.

That's what I had originally, but I put the * in to see if it 
would help with the original issue and never removed it




More information about the Digitalmars-d-learn mailing list